2017-04-21 192 views
2

我在numpy的以下3D陣列:重塑3D numpy的陣列到2D陣列

a = np.array([[[1,2],[3,4]], [[5,6],[7,8]], [[9,10],[11,12]],[[13,14],[15,16]]]) 

當我寫

b = np.reshape(a, [4,4]) 

二維所得陣列看起來像

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

但是,我希望它在這種形狀:

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

如何在Python/Numpy中高效地執行此操作?

回答

2

重塑到第一軸一分爲二,置換軸和一個更重塑 -

a.reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,4) 
a.reshape(2,2,2,2).swapaxes(1,2).reshape(4,4) 

使其成爲通用的,將成爲 -

m,n,r = a.shape 
out = a.reshape(m//2,2,n,r).swapaxes(1,2).reshape(-1,2*r) 

採樣運行 -

In [20]: a 
Out[20]: 
array([[[ 1, 2], 
     [ 3, 4]], 

     [[ 5, 6], 
     [ 7, 8]], 

     [[ 9, 10], 
     [11, 12]], 

     [[13, 14], 
     [15, 16]]]) 

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

僅使用np.hstacknp.vstack的另一種方法:

In [98]: a 
Out[98]: 
array([[[ 1, 2], 
     [ 3, 4]], 

     [[ 5, 6], 
     [ 7, 8]], 

     [[ 9, 10], 
     [11, 12]], 

     [[13, 14], 
     [15, 16]]]) 

In [99]: s0, s1, s2, s3 = range(a.shape[0]) 

In [100]: np.vstack((np.hstack((a[s0], a[s1])), np.hstack((a[s2], a[s3])))) 
Out[100]: 
array([[ 1, 2, 5, 6], 
     [ 3, 4, 7, 8], 
     [ 9, 10, 13, 14], 
     [11, 12, 15, 16]]) 

認識到這樣的事實,即您的目標是將原始數組的前兩個切片壓扁成一個切片,將下兩個切片壓入另一個切片中,等等。

如果你關心性能,你也可以用np.vstacknp.hstack替代他們最快的表親np.concatenate

P.S .:這種方法創建一個新的陣列,使原來的陣列保持不變。