【问题标题】:Python Reshape 3d array into 2dPython将3d数组重塑为2d
【发布时间】:2026-01-30 06:10:01
【问题描述】:

我想将图中所示的 numpy 数组从 3D 重塑为 2D。不幸的是,顺序不正确。

假设有一个 numpy 数组 (1024, 64, 100) 并希望将其转换为 (1024*100, 64)。

有人知道如何维持秩序吗?

我有一个样本数据

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.]]]

【问题讨论】:

    标签: python numpy reshape


    【解决方案1】:

    看起来你可以使用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.]]])
    

    【讨论】:

    • 偶然发现这个问题,看到第一行答案,猜到作者了;)谢谢指点!
    • @AndrasDeak 你因为太无聊而四处寻找旧的 NumPy 问题? :)
    【解决方案2】:

    使用 einops:

    # start with (1024, 64, 100) to (1024*100, 64):
    einops.rearrange('h w i -> (i h) w')
    
    # or we could concatenate along horizontal axis to get (1024, 64 * 100):
    einops.rearrange('h w i -> h (i w)')
    

    更多示例请参见docs

    【讨论】: