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
存储在一个属性中,并实现push
和pop
或get
方法。不要忘记在 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)
我需要一个很好的缓冲区来存储 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
存储在一个属性中,并实现push
和pop
或get
方法。不要忘记在 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)