2015-10-19 102 views
1

我想重新塑造numpy數組,如圖所示,從3D到2D。不幸的是,訂單不正確。Python重塑3d數組到2d

A假定有一個numpy數組(1024,64,100)並且想要將其轉換爲(1024 * 100,64)。

有沒有人有想法如何維持秩序?

Image - click here

我有一個樣本數據

data[0,0,0]=1 
data[0,1,0]=2 
data[0,2,0]=3 
data[0,3,0]=4 
data[1,0,0]=5 
data[1,1,0]=6 
data[1,2,0]=7 
data[1,3,0]=8 
data[2,0,0]=9 
data[2,1,0]=10 
data[2,2,0]=11 
data[2,3,0]=12 
data[0,0,1]=20 
data[0,1,1]=21 
data[0,2,1]=22 
data[0,3,1]=23 
data[1,0,1]=24 
data[1,1,1]=25 
data[1,2,1]=26 
data[1,3,1]=27 
data[2,0,1]=28 
data[2,1,1]=29 
data[2,2,1]=30 
data[2,3,1]=31 

和我想有一個這樣的結果:

array([[ 1., 2., 3., 4.], 
     [ 5., 6., 7., 8.], 
     [ 9., 10., 11., 12.], 
     [ 20., 21., 22., 23.], 
     [ 24., 25., 26., 27.], 
     [ 28., 29., 30., 31.]]) 

而且,我還希望有以另一種方式重塑,即從:

array([[ 1., 2., 3., 4.], 
     [ 5., 6., 7., 8.], 
     [ 9., 10., 11., 12.], 
     [ 20., 21., 22., 23.], 
     [ 24., 25., 26., 27.], 
     [ 28., 29., 30., 31.]]) 

到所需的輸出:

[[[ 1. 20.] 
    [ 2. 21.] 
    [ 3. 22.] 
    [ 4. 23.]] 

[[ 5. 24.] 
    [ 6. 25.] 
    [ 7. 26.] 
    [ 8. 27.]] 

[[ 9. 28.] 
    [ 10. 29.] 
    [ 11. 30.] 
    [ 12. 31.]]] 

回答

7

看起來你可以使用numpy.transpose,然後重塑,像這樣 -

data.transpose(2,0,1).reshape(-1,data.shape[1]) 

採樣運行 -

In [63]: data 
Out[63]: 
array([[[ 1., 20.], 
     [ 2., 21.], 
     [ 3., 22.], 
     [ 4., 23.]], 

     [[ 5., 24.], 
     [ 6., 25.], 
     [ 7., 26.], 
     [ 8., 27.]], 

     [[ 9., 28.], 
     [ 10., 29.], 
     [ 11., 30.], 
     [ 12., 31.]]]) 

In [64]: data.shape 
Out[64]: (3, 4, 2) 

In [65]: data.transpose(2,0,1).reshape(-1,data.shape[1]) 
Out[65]: 
array([[ 1., 2., 3., 4.], 
     [ 5., 6., 7., 8.], 
     [ 9., 10., 11., 12.], 
     [ 20., 21., 22., 23.], 
     [ 24., 25., 26., 27.], 
     [ 28., 29., 30., 31.]]) 

In [66]: data.transpose(2,0,1).reshape(-1,data.shape[1]).shape 
Out[66]: (6, 4) 

要取回原始3D陣列,使用reshape,然後使用numpy.transpose,像這樣 -

In [70]: data2D.reshape(np.roll(data.shape,1)).transpose(1,2,0) 
Out[70]: 
array([[[ 1., 20.], 
     [ 2., 21.], 
     [ 3., 22.], 
     [ 4., 23.]], 

     [[ 5., 24.], 
     [ 6., 25.], 
     [ 7., 26.], 
     [ 8., 27.]], 

     [[ 9., 28.], 
     [ 10., 29.], 
     [ 11., 30.], 
     [ 12., 31.]]]) 
+0

@pallago請查看編輯。 – Divakar

+0

剛發現這個問題不小心,看到了答案的第一行,並猜測作者;)感謝提示! –

+0

@AndrasDeak你在尋找舊的NumPy問題時徘徊,因爲你太無聊了? :) – Divakar