In [54]: arr = np.array([[[ 1., 5., 4.],
[ 1., 5., 4.],
[ 1., 2., 4.]],
[[ 3., 6., 4.],
[ 6., 6., 4.],
[ 6., 6., 4.]]])
In [61]: arr.reshape((arr.shape[0], -1), order='F')
Out[61]:
array([[ 1., 1., 1., 5., 5., 2., 4., 4., 4.],
[ 3., 6., 6., 6., 6., 6., 4., 4., 4.]])
数组arr
的形状为(2, 3, 3)
。我们希望保留长度为2的第一轴,并将长度为3的两个轴展平。
如果我们调用arr.reshape(h, w)
,NumPy将尝试将arr
重塑为形状(h, w)
。如果我们调用arr.reshape(h, -1)
,则NumPy将使用任何需要的整数替换-1
以使重塑合理——在本例中,为arr.size/h
。
因此,
In [63]: arr.reshape((arr.shape[0], -1))
Out[63]:
array([[ 1., 5., 4., 1., 5., 4., 1., 2., 4.],
[ 3., 6., 4., 6., 6., 4., 6., 6., 4.]])
这几乎就是我们想要的,但请注意每个子数组中的值,例如
[[ 1., 5., 4.],
[ 1., 5., 4.],
[ 1., 2., 4.]]
通过从左到右遍历,然后再向下进入下一行来遍历这些数组。
我们希望在进入下一列之前先沿着行向下遍历。
为实现这一点,请使用 order='F'
。
通常情况下,NumPy 数组中的元素是按照 C-order
(最后一个索引移动得最快)进行访问的。如果我们按照 F-order
进行访问,则第一个索引会移动得最快。由于在形状为 (h, w)
的 2D 数组中,第一个轴与行相关联,最后一个轴与列相关联,因此以 F-order
遍历数组会先沿着每行向下遍历,然后再进入下一列。