2017-06-01 116 views
2

我試圖使用從numpy.lib.stride_tricks的功能從較大的二維數組中提取子序列,但我努力尋找寫出正確的東西爲strides參數。沿着二維陣列的最後一個軸滑動窗口,使用NumPy步幅給出一個3D陣列

比方說,我有一個矩陣m其中包含5個1D長度數組(a=)10。我想提取長度(b=)4的子一維數組中的每個m 1D陣列。

import numpy 
from numpy.lib.stride_tricks import as_strided 

a, b = 10, 4 
m = numpy.array([range(i,i+a) for i in range(5)]) 

# first try 
sub_m = as_strided(m, shape=(m.shape[0], m.shape[1]-b+1, b)) 
print sub_m.shape # (5,7,4) which is what i expected 
print sub_m[-1,-1,-1] # Some unexpected strange number: 8227625857902995061 

# second try with strides argument 
sub_m = as_strided(m, shape=(m.shape[0], m.shape[1]-b+1, b), strides=(m.itemize,m.itemize,m.itemize)) 
# gives error, see below 

AttributeError: 'numpy.ndarray' object has no attribute 'itemize'

正如你可以看到我成功拿到了sub_m正確的形狀在我第一次嘗試。但是我無法找到如何在strides=()

寫信息:

m = [[ 0 1 2 3 4 5 6 7 8 9] 
[ 1 2 3 4 5 6 7 8 9 10] 
[ 2 3 4 5 6 7 8 9 10 11] 
[ 3 4 5 6 7 8 9 10 11 12] 
[ 4 5 6 7 8 9 10 11 12 13]] 

預期輸出:

sub_n = [ 
     [[0 1 2 3] [1 2 3 4] ... [5 6 7 8] [6 7 8 9]] 
     [[1 2 3 4] [2 3 4 5] ... [6 7 8 9] [7 8 9 10]] 
     [[2 3 4 5] [3 4 5 6] ... [7 8 9 10] [8 9 10 11]] 
     [[3 4 5 6] [4 5 6 7] ... [8 9 10 11] [9 10 11 12]] 
     [[4 5 6 7] [5 6 7 8] ... [9 10 11 12] [10 11 12 13]] 
     ] 

編輯:我有更多的數據,這就是爲什麼我要使用as_strided(效率)

+0

有什麼預期輸出的形狀?考慮輸入具有形狀(M,N),你必須說'L'的步幅。 – Divakar

+0

預期輸出形狀:(5,7,4'-)(M,N,L),其中L = M-4 + 1 – Nuageux

+0

也許你的意思(M,N-L + 1,L)? – Divakar

回答

1

下面是與一種方法- 對進展解釋as_strided

def strided_lastaxis(a, L): 
    s0,s1 = a.strides 
    m,n = a.shape 
    return np.lib.stride_tricks.as_strided(a, shape=(m,n-L+1,L), strides=(s0,s1,s1)) 

位:

我們有3D的進步,通過沿最後一個/第三軸一個元素,所以s1還有最後軸跨步增量。所述第二軸線的進展由相同的一個元件的「距離」,從而爲s1太多。對於第一軸,是跨步一樣的陣列的第一軸線步幅長度,如在我們繼續的下一行,所以s0那裏。

採樣運行 -

In [46]: a 
Out[46]: 
array([[0, 5, 6, 2, 3, 6, 7, 1, 4, 8], 
     [2, 1, 3, 7, 0, 3, 5, 4, 0, 1]]) 

In [47]: strided_lastaxis(a, L=4) 
Out[47]: 
array([[[0, 5, 6, 2], 
     [5, 6, 2, 3], 
     [6, 2, 3, 6], 
     [2, 3, 6, 7], 
     [3, 6, 7, 1], 
     [6, 7, 1, 4], 
     [7, 1, 4, 8]], 

     [[2, 1, 3, 7], 
     [1, 3, 7, 0], 
     [3, 7, 0, 3], 
     [7, 0, 3, 5], 
     [0, 3, 5, 4], 
     [3, 5, 4, 0], 
     [5, 4, 0, 1]]]) 
+0

謝謝!有用。但是我仍然不明白我應該在最後一個論點中提出什麼。 '(s0,s1,s1)'從哪裏來?我真的很感激,如果你可以添加更多的細節,所以下次我不必問:) – Nuageux

+0

@Nuageux衷心的道歉先生!新增評論。 – Divakar

+0

非常感謝您的解釋,這不是我第一次與這個功能作鬥爭,下次我想我不會! (PS:爲什麼先生?) – Nuageux

相關問題