NumPy 使用 reshape 函数重塑数组

NumPy using the reshape function to reshape an array

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

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

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

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

您可以在 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]])

这些做同样的事情:

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 中各行的值通常为 'read'。这是 call row-major 或 'C' order。往下读是 '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])

你得到那个特定结果的原因是数组通常是按 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()