【问题标题】:Numpy: Reshape array along a specified axisNumpy:沿指定轴重塑数组
【发布时间】:2016-12-20 03:36:56
【问题描述】:

我有以下数组:

x = np.arange(24).reshape((2,3,2,2))
array([[[[ 0,  1],
     [ 2,  3]],

    [[ 4,  5],
     [ 6,  7]],

    [[ 8,  9],
     [10, 11]]],


   [[[12, 13],
     [14, 15]],

    [[16, 17],
     [18, 19]],

    [[20, 21],
     [22, 23]]]])

我想将它重塑为如下所示的 (3,4,2) 数组:

array([[[ 0,  1],
    [ 2,  3],
    [12, 13],
    [14, 15]],

   [[ 4,  5],
    [ 6,  7],
    [16, 17],
    [18, 19]],

   [[ 8,  9],
    [10, 11],
    [20, 21],
    [22, 23]]])

我尝试使用 reshape,但它给了我以下不是我想要的。

array([[[ 0,  1],
    [ 2,  3],
    [ 4,  5],
    [ 6,  7]],

   [[ 8,  9],
    [10, 11],
    [12, 13],
    [14, 15]],

   [[16, 17],
    [18, 19],
    [20, 21],
    [22, 23]]])

有人可以帮忙吗?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:
    x = np.arange(24).reshape((2,3,2,2))
    y = np.dstack(zip(x))[0]
    print y
    

    结果:

    [[[ 0  1]
      [ 2  3]
      [12 13]
      [14 15]]
    
     [[ 4  5]
      [ 6  7]
      [16 17]
      [18 19]]
    
     [[ 8  9]
      [10 11]
      [20 21]
      [22 23]]]
    

    【讨论】:

    • 谢谢朱利安。这工作正常。但是,出于性能原因,我更喜欢原生 numpy 解决方案。
    • 此函数将用于多次转换大型 numpy 数组。我不确定 zip 是否针对此类数组操作进行了优化。
    • 您和 Divakar 的解决方案都没有问题。我只是花了一点时间测试这两种解决方案的性能。事实证明 Divakar 的解决方案要快两倍,所以我将他的解决方案标记为答案。谢谢你们。
    【解决方案2】:

    像这样使用transpose,然后使用reshape -

    shp = x.shape
    out = x.transpose(1,0,2,3).reshape(shp[1],-1,shp[-1])
    

    【讨论】:

      【解决方案3】:

      你也可以像这样使用concatenate-

      out=np.concatenate((x),axis=1)
      

      我会注意那些,因为你提到这是为了性能,这似乎并不比Divakar 建议快:

      shp = x.shape
      out = x.transpose(1,0,2,3).reshape(shp[1],-1,shp[-1])
      

      如果有人做基准测试或找到更快的东西,我很想知道。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-15
        • 2011-06-29
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 2011-01-22
        • 1970-01-01
        相关资源
        最近更新 更多