将3D Numpy Array重塑为2D阵列

时间:2017-04-21 16:13:21

标签: python arrays numpy reshape

我在Numpy中有以下3D数组:

AtleastOnceDelivery

当我写

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

2D结果数组看起来像

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

但是,我希望它具有这种形状:

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

如何在Python / Numpy中有效地完成这项工作?

2 个答案:

答案 0 :(得分: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 :(得分: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.vstack替换np.hstacknp.concatenate

P.S。:这种方法创建了一个新阵列,使原来的阵列保持不变。