2014-09-05 54 views
1

我正在研究實時應用程序。爲此,我需要每秒存儲大約20個數組。每個數組由n個具有相應x和y座標的點組成(z可能會在未來出現)。用於n維向量的環形緩衝區

我所做的是一種環形緩衝區,它佔用了總陣列的長度(它是一個視頻btw的幀)和點的數量與它們的座標(這不會改變在一次執行中,但是對於下面的執行是可變的)。

我的緩衝inits填充爲0的numpy的數組:np.zeros((lengthOfSlices,numberOfTrackedPoints))

然而,這似乎是有問題的,因爲我寫了一個切片整點入陣一次,之後沒有其他。這意味着我無法播放陣列,因爲形狀不正確。

是否有一種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

需要基於幀的lenght重塑陣列。

簡單的例子:

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

+0

好吧,可以說如果我有128幀的視頻和2個跟蹤點乘以x和y的形狀(128,2,2)。我如何正確索引我的計算值? 例如,我得到了類似result = [[236,218],[267,220]]的結果作爲一幀。我不能只索引「self.data [0] = result」,因爲那麼它只會填充數組,但會覆蓋我的數據結構,並以IndexErrors結束。 – emuecke 2014-09-05 12:03:48

+0

你應該可以做self.data [0] =結果,除非你的索引計算是錯誤的,我懷疑(你添加一個整數和一個numpy數組),因此使用collections.deque可能更簡單 – Emilien 2014-09-05 12:18:36