我正在开发一个实时应用程序。为此,我需要每秒存储大约20个数组。每个数组由n个点组成,它们各自的x和y坐标(z也可能在将来跟随)。
我所做的是某种环形缓冲区,它取整个数组的长度(它是视频的帧btw。)和带有坐标的点数(这不会改变一次执行,但对于后面的执行是可变的)。
我的缓冲区中有一个填充零的numpy数组:np.zeros((lengthOfSlices,numberOfTrackedPoints))
然而,这似乎是有问题的,因为我将一个Slice的整个Points一次写入数组,而不是另一个。这意味着我不能广播数组,因为形状不正确。
是否有numPythonic方法用零初始化数组并在之后存储矢量?
下面你可以找到我现在拥有的东西:
class Buffer():
def __init__(self, lengthOfSlices, numberOfTrackedPoints):
self.data = np.zeros((lengthOfSlices,numberOfTrackedPoints))
self.index = 0
def extend(self, x):
'adds array x to ring buffer'
x_index = (self.index + np.arange(x.size)) % self.data.size
self.data[x_index] = x
self.index = x_index[-1] + 1
def get(self):
'returns the first-in-first-out data in the ring buffer'
idx = (self.index + np.arange(self.data.size)) % self.data.size
return self.data[idx]
答案 0 :(得分:0)
您需要根据帧的长度重新整形数组。
简单示例:
>>> import numpy as np
>>> A = np.zeros(100)
>>> B = np.reshape(A, (10,10))
>>> B[0]
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
所以这可能类似于self.data = np.reshape(self.data, (lengthOfAFrame, 20))
编辑: 显然重塑不是你的(唯一的?)问题,你可以检查collections.deque是否有循环缓冲区的python实现(source and example)