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()
我有一个数组:[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()