2017-07-17 53 views
1

目前我訪問多個片段如下:你如何有效地從numpy的數組訪問多個切片

首先,我分配將被重新分配數組多次

X = np.zeros((batch_size, window, 5)) 

這是將運行多次分配迴路(batch_indices有不同的索引每次但相同的形狀):

for i, b in enumerate(batch_indices): 
    X[i] = Xs[b:b+window] 

有沒有更有效的方法?我覺得好像有應語法類似於:

X = Xs[ [slice(b,b+window) for b in batch_indices] ] 

雖然Xs形狀爲2維的,X的最終形狀應該是一個3維np.array。可以這樣想:Xs是一個長時間多維時間序列,X需要是一個包含多維時間序列切片的numpy數組。

+0

你看過[numpy迭代](https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html)嗎? –

+0

你有嘗試布爾索引嗎?值得進行性能檢查...... – Raf

+0

發佈的解決方案是否適合您? – Divakar

回答

2

方法#1

一個量化的方法是創建所有的滑動窗口索引和索引Xs這些,像這樣 -

X = Xs[np.asarray(batch_indices)[:,None] + np.arange(window)] 

方法2

另一種有效的記憶方法是創建sliding-windowsnp.lib.stride_tricks.as_strided,從而避免了滑動窗口指數發展在之前的做法,只是做指數與batch_indices,像這樣 -

X = strided_axis0(Xs,window)[np.asarray(batch_indices)] 

跨越式發展基於功能strided_axis0here