NumPy ndarray 数据需要缓冲区 class

Need a buffer class for NumPy ndarray data

我需要一个很好的缓冲区来存储 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)  

你不能给我这样的建议吗?

numpy 和 ndarray 可以完成您描述的操作,无需任何额外的 classes:

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

如果这对您来说足够好取决于您对 "good buffer"...

的期望

它可以这样工作:

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)

如果你想隐藏细节,你可以创建一个class,将buffer存储在一个属性中,并实现pushpopget 方法。不要忘记在 getter (num_of_elements_to_get <= buffer.size) 中进行错误检查。如果它只有 returns 个元素,我会调用方法 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)