n维向量的环形缓冲区

1 投票
1 回答
558 浏览
提问于 2025-04-20 00:03

我正在开发一个实时应用程序。为了实现这个目标,我需要每秒存储大约20个数组。每个数组包含一些点,每个点都有自己的x和y坐标(将来可能还会有z坐标)。

我想到了一种环形缓冲区的方式,它的长度是所有数组的总长度(顺便说一下,这些数组可以看作是视频的帧),还有每个点的坐标数量(这个数量在一次执行中是固定的,但在后续执行中可能会变化)。

我的缓冲区是用一个全是零的numpy数组初始化的:np.zeros((lengthOfSlices,numberOfTrackedPoints))

不过,这似乎有点问题,因为我一次性把一个切片的所有点写入数组,而不是一个一个写。这就导致我无法正确地广播这个数组,因为它的形状不对。

有没有什么更符合numpy风格的方法来初始化这个全零的数组,然后再按向量的方式存储数据呢?

下面是我现在的代码:

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

你需要根据帧的长度来调整数组的形状。

简单的例子:

>>> 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中实现循环缓冲区的工具(来源和示例

撰写回答