n维向量的环形缓冲区
我正在开发一个实时应用程序。为了实现这个目标,我需要每秒存储大约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中实现循环缓冲区的工具(来源和示例)