【问题标题】:Need a buffer class for NumPy ndarray data需要 NumPy ndarray 数据的缓冲区类
【发布时间】:2016-03-16 13:48:44
【问题描述】:

我需要一个很好的 numpy ndarray 数据缓冲区。我需要推送一些数组,队列应该以某种方式将它们连接成一个,然后我想从中得到任意长度的数组。

类似这样的:

# push some numpy arrays into buffer
buffer.push(in_array_1)
buffer.push(in_array_2)
buffer.push(in_array_3)

# return a new numpy array with arbitrary length num_of_elements_to_get
out_array = buffer.get(num_of_elements_to_get)  

你能不能给我一些类似的建议?

【问题讨论】:

    标签: python numpy scipy queue containers


    【解决方案1】:

    numpy 和 ndarray 可以做你描述的事情,不需要任何额外的类:

    • 要将数组推送到缓冲区,请将它们连接到数组
    • 要从缓冲区中获取元素,请访问切片(然后删除它,如果你想要的话)

    这对你来说是否足够好取决于你对“好的缓冲区”的期望......

    它可以这样工作:

    buffer = np.array([])
    
    # I assume the arrays are one-dimensional.
    buffer = np.concatenate([buffer, in_array_1])
    buffer = np.concatenate([buffer, in_array_2])
    buffer = np.concatenate([buffer, in_array_3])
    
    out_array = buffer[:num_of_elements_to_get]
    buffer = np.delete(buffer, slice(0, num_of_elements_to_get))  # remove elements (optional)
    

    如果你想隐藏细节,你可以创建一个在属性中存储buffer的类,并实现pushpopget方法。不要忘记在 getter (num_of_elements_to_get <= buffer.size) 中检查错误。如果它只返回元素,我会调用方法get,如果它删除元素,我会调用pop


    正如 hpaulj 指出的,可以在一个函数调用中组合多个串联:

    buffer = np.concatenate([buffer, in_array_1, in_array_2, in_array_3])
    

    这会减少缓冲区的重新分配。但是,如果分配是一个问题,最好投入更多精力并实现一个环形缓冲区。

    作为附加说明,一个setter方法可以设计成接受多个数组:

    def push(self, *args):
        self.buffer = np.concatenate([self.buffer] + args)
    

    【讨论】:

    • 但是buffer = np.concatenate([in_array_1, in_array_2, in_array_3]) 会更好numpy 代码。它只是看起来不像 buffer.push... 模型。
    • @hpaulj 是的。我认为这是三个独立推送的示例,但如果同时有更多输入可用,您的评论是有道理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2022-10-24
    • 2013-09-10
    • 2021-10-01
    相关资源
    最近更新 更多