【问题标题】:NumPy using the reshape function to reshape an array [duplicate]NumPy 使用重塑函数重塑数组 [重复]
【发布时间】:2020-07-11 08:58:33
【问题描述】:

我有一个数组:[1, 2, 3, 4, 5, 6]。我想使用numpy.reshape() 函数,这样我就得到了这个数组:

[[1, 4],
 [2, 5],
 [3, 6]
]

我不知道该怎么做。我一直以这个结束,这不是我想要的:

[[1, 2],
 [3, 4],
 [5, 6]
]

【问题讨论】:

  • np.array(data).reshape(2,-1).T?

标签: python arrays numpy reshape


【解决方案1】:

它们做同样的事情:

In [57]: np.reshape([1,2,3,4,5,6], (3,2), order='F')                                           
Out[57]: 
array([[1, 4],
       [2, 5],
       [3, 6]])
In [58]: np.reshape([1,2,3,4,5,6], (2,3)).T                                                    
Out[58]: 
array([[1, 4],
       [2, 5],
       [3, 6]])

通常在 Python/numpy 中跨行“读取”值。这是调用行优先或“C”顺序。往下读的是 'F',代表 FORTRAN,在有 Fortran 根的 MATLAB 中很常见。

如果您采用“F”顺序,制作一个新副本并将其串出,您将获得不同的顺序:

In [59]: np.reshape([1,2,3,4,5,6], (3,2), order='F').copy().ravel()                            
Out[59]: array([1, 4, 2, 5, 3, 6])

【讨论】:

    【解决方案2】:

    您可以在np.reshape中设置顺序,在您的情况下您可以使用'F'。详情见docs

    >>> arr
    array([1, 2, 3, 4, 5, 6])
    
    >>> arr.reshape(-1, 2, order = 'F')
    array([[1, 4],
           [2, 5],
           [3, 6]])
    

    【讨论】:

      【解决方案3】:

      您获得该特定结果的原因是数组通常按 C 顺序分配。这意味着仅靠重塑是不够的。您必须告诉 numpy 在沿数组步进时更改轴的顺序。任何数量的操作都可以让你做到这一点:

      • 将轴顺序设置为F。 F 代表 Fortran,它和 MATLAB 一样,通常使用列优先顺序:

        a.reshape(2, 3, order='F')
        
      • 整形后交换轴:

        np.swapaxes(a.reshape(2, 3), 0, 1)
        
      • 转置结果:

        a.reshape(2, 3).T
        
      • 向前滚动第二个轴:

        np.rollaxis(a.reshape(2, 3), 1)
        

      请注意,除第一种情况外,所有情况都需要您重新整形为转置。

      您甚至可以手动排列数据

      np.stack((a[:3], a[3:]), axis=1)
      

      请注意,这会产生许多不必要的副本。如果你想复制数据,就这样做

      a.reshape(2, 3, order='F').copy()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        • 2020-10-19
        • 2016-02-10
        • 2013-12-13
        • 2020-10-25
        • 2021-03-03
        相关资源
        最近更新 更多