我有一个数组:[1, 2, 3, 4, 5, 6]
。我想使用numpy.reshape()
函数,以便最终得到这个数组:
[[1, 4],
[2, 5],
[3, 6]
]
我不确定该怎么做。我一直以这个结尾,这不是我想要的:
[[1, 2],
[3, 4],
[5, 6]
]
答案 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()