【问题标题】:Split and Swap Items in Nth Dimension to Nth+1 Dimension将第 N 维中的项目拆分和交换到第 N+1 维
【发布时间】:2019-10-05 20:29:09
【问题描述】:

假设我有一个这样的 numpy 数组:

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

尺寸为 (1, 4, 4)

我想把它转换成:

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

尺寸为 (1, 4, 2, 2)。

numpy 中有什么函数可以用来修改数组吗?

  • array.reshape() 很接近,但不完全是因为它不能交换项目。

我想避免直接使用 python,因为这段代码用于格式化神经网络输入的一些数据,并且 python 的速度(考虑到实际数组的大小)可能是一个瓶颈。

【问题讨论】:

    标签: python numpy numpy-ndarray


    【解决方案1】:

    你很接近。然后你唯一需要做的就是交换第三和第四轴:

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

    【讨论】:

    • 虽然这个答案直接解决了我的问题,但 Divakar 的答案更通用,可能对阅读这个问题的人更有用。
    【解决方案2】:

    拆分最后一个轴,然后置换轴 -

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

    如果您需要最终输出形状为(1,4,2,2),请在前面添加一个带有None/np.newaxis 的新轴 -

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

    对于每个列表的元素数量已知的一般情况,比如n,它将是 -

    a.reshape(-1,n,a.shape[-1]//n).swapaxes(1,2)[None]
    

    More info onnd-arraystransformation.

    【讨论】:

      【解决方案3】:

      您可以要求 reshape 使用 FORTRAN 命令:

      a = np.arange(1,17).reshape(1,4,4)
      
      a.reshape(*a.shape[:-1],2,2,order="F")
      # array([[[[ 1,  3],
      #          [ 2,  4]],
      # 
      #         [[ 5,  7],
      #          [ 6,  8]],
      # 
      #         [[ 9, 11],
      #          [10, 12]],
      # 
      #         [[13, 15],
      #          [14, 16]]]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-26
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        • 2015-11-17
        相关资源
        最近更新 更多