NumPy使用重塑函数重塑数组

时间:2020-03-30 21:35:02

标签: python arrays numpy reshape

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

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

我不确定该怎么做。我一直以这个结尾,这不是我想要的:

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

3 个答案:

答案 0 :(得分:4)

这些操作相同:

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”顺序。对于FORTRAN,其读数为'F',在具有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])

答案 1 :(得分: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]])

答案 2 :(得分:2)

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