用于n维向量的环形缓冲区

时间:2014-09-05 09:23:04

标签: python arrays python-2.7 numpy

我正在开发一个实时应用程序。为此,我需要每秒存储大约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]

1 个答案:

答案 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