2017-04-03 89 views
1

滑動窗我有這種形式的2- d numpy的數組:從2D陣列,其沿着軸= 0或行滑動,得到3D陣列

[[ 0. 1. 2. 3. 4.] 
[ 5. 6. 7. 8. 9.] 
[ 10. 11. 12. 13. 14.] 
[ 15. 16. 17. 18. 19.] 
[ 20. 21. 22. 23. 24.] 
[ 25. 26. 27. 28. 29.] 
[ 30. 31. 32. 33. 34.] 
[ 35. 36. 37. 38. 39.] 
[ 40. 41. 42. 43. 44.] 
[ 45. 46. 47. 48. 49.]] 

我想要構造陣列的圖,分組在其移動窗元件(大小爲4的在我的例子)。我的結果應該是形狀(6, 4, 5)的,我可以如下構造它:

res = [] 
mem = 4 
for i in range(mem, X.shape[0]+1): 
    res.append(X[i-mem:i, : ]) 
res = np.asarray(res) 
print res.shape 

我想避免重新分配,所以我不知道我是否能構建一個視圖給這個結果,as_strided例如。

過程的解釋是非常歡迎的。

感謝

回答

3

這裏有一個方法與要求np.lib.stride_tricks.as_strided -

def strided_axis0(a, L): 
    # INPUTS : 
    # a is array 
    # L is length of array along axis=0 to be cut for forming each subarray 

    # Length of 3D output array along its axis=0 
    nd0 = a.shape[0] - L + 1 

    # Store shape and strides info 
    m,n = a.shape 
    s0,s1 = a.strides 

    # Finally use strides to get the 3D array view 
    return np.lib.stride_tricks.as_strided(a, shape=(nd0,L,n), strides=(s0,s0,s1)) 

採樣運行 -

In [48]: X = np.arange(35).reshape(-1,5) 

In [49]: X 
Out[49]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24], 
     [25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34]]) 

In [50]: strided_axis0(X, L=4) 
Out[50]: 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]], 

     [[ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]], 

     [[10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24], 
     [25, 26, 27, 28, 29]], 

     [[15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24], 
     [25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34]]]) 
+0

非常感謝Divakar! – volatile