【问题标题】:Ring Buffer for n-dimensional Vectorsn 维向量的环形缓冲区
【发布时间】:2014-10-30 05:07:48
【问题描述】:

我正在开发一个实时应用程序。为此,我需要每秒存储大约 20 个数组。每个数组由 n 个点组成,它们具有各自的 x 和 y 坐标(z 将来也可能跟随)。

我想出的是某种环形缓冲区,它采用总数组的长度(顺便说一句,它是视频的帧)和点的数量及其坐标(这不会在一次执行,但对于后续执行是可变的)。

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

但是这似乎是有问题的,因为我一次将整个 Points for a Slice 写入数组,而不是一个接一个。这意味着我无法广播数组,因为形状不正确。

有没有一种 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]

【问题讨论】:

    标签: python arrays python-2.7 numpy


    【解决方案1】:

    您需要根据框架的长度重新调整数组的形状。

    简单示例:

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

    【讨论】:

    • 好的,假设我得到一个像 (128,2,2) 这样的形状,用于 128 帧和 2 个跟踪点乘以 x 和 y 的视频。如何正确索引我的计算值?例如,我得到类似 result = [[236, 218],[267, 220]] 的结果作为一帧的结果。我不能只索引“self.data[0] = result”,因为那样它只会填满数组但会覆盖我的数据结构,它以 IndexErrors 结尾。
    • 您应该能够执行 self.data[0] = result,除非我怀疑您的索引计算错误(您添加了一个整数和一个 numpy 数组),因此使用集合可能更简单.deque
    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多