【问题标题】:Reshaping 3D Numpy Array to a 2D array将 3D Numpy 数组重塑为 2D 数组
【发布时间】:2017-09-18 17:40:18
【问题描述】:

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

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 中有效地做到这一点?

【问题讨论】:

    标签: python arrays numpy reshape


    【解决方案1】:

    Reshape 将第一个轴分成两个,置换轴和一个 reshape -

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

    【讨论】:

      【解决方案2】:

      仅使用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.:这种方法会创建一个新数组,而您的原始数组保持不变。

      【讨论】:

        猜你喜欢
        • 2016-05-22
        • 2015-10-19
        • 2019-09-12
        • 1970-01-01
        • 2019-07-10
        • 2016-01-17
        • 2016-06-01
        • 2020-04-22
        • 1970-01-01
        相关资源
        最近更新 更多