2017-08-18 124 views
4

我會使用NumPy或原生函數將2d數組轉換爲3d與前一行。將2D陣列變換爲重疊大步的3D陣列

輸入:

[[1,2,3], 
[4,5,6], 
[7,8,9], 
[10,11,12], 
[13,14,15]] 

輸出:

[[[7,8,9], [4,5,6], [1,2,3]], 
[[10,11,12], [7,8,9], [4,5,6]], 
[[13,14,15], [10,11,12], [7,8,9]]] 

任何一個可以幫助? 我在網上搜索了一段時間,但無法得到答案。

+2

我想我明白你想要什麼,但它與你在問題中寫下的內容沒有任何關係。到目前爲止你做了什麼?請發佈您的代碼。 – DyZ

+1

@DYZ不確定混淆的地方。 OP已經列出了2D輸入和預期的3D輸出,該輸出具有從2D輸入中拾取的行,這些行是當前的行和先前的行,再次列出在期望的輸出中。 – Divakar

回答

5

方法#1

一個與np.lib.stride_tricks.as_strided做法,給了我們一個view到輸入2D陣列,因此不會佔用了內存空間 -

L = 3 # window length for sliding along the first axis 
s0,s1 = a.strides 

shp = a.shape 
out_shp = shp[0] - L + 1, L, shp[1] 
strided = np.lib.stride_tricks.as_strided 
out = strided(a[L-1:], shape=out_shp, strides=(s0,-s0,s1)) 

樣品輸入,輸出 -

In [43]: a 
Out[43]: 
array([[ 1, 2, 3], 
     [ 4, 5, 6], 
     [ 7, 8, 9], 
     [10, 11, 12], 
     [13, 14, 15]]) 

In [44]: out 
Out[44]: 
array([[[ 7, 8, 9], 
     [ 4, 5, 6], 
     [ 1, 2, 3]], 

     [[10, 11, 12], 
     [ 7, 8, 9], 
     [ 4, 5, 6]], 

     [[13, 14, 15], 
     [10, 11, 12], 
     [ 7, 8, 9]]]) 

方法2

或者,在生成所有行索引的有點容易用一個broadcasting -

In [56]: a[range(L-1,-1,-1) + np.arange(shp[0]-L+1)[:,None]] 
Out[56]: 
array([[[ 7, 8, 9], 
     [ 4, 5, 6], 
     [ 1, 2, 3]], 

     [[10, 11, 12], 
     [ 7, 8, 9], 
     [ 4, 5, 6]], 

     [[13, 14, 15], 
     [10, 11, 12], 
     [ 7, 8, 9]]]) 
3

如何列表理解?

In [144]: np.array([l[i:i + 3][::-1] for i in range(0, len(l) - 2)]) 
Out[144]: 
array([[[ 7, 8, 9], 
     [ 4, 5, 6], 
     [ 1, 2, 3]], 

     [[10, 11, 12], 
     [ 7, 8, 9], 
     [ 4, 5, 6]], 

     [[13, 14, 15], 
     [10, 11, 12], 
     [ 7, 8, 9]]])