我有一个3d numpy数组的以下形式:
array([[[ 1., 5., 4.],
[ 1., 5., 4.],
[ 1., 2., 4.]],
[[ 3., 6., 4.],
[ 6., 6., 4.],
[ 6., 6., 4.]]])
Run Code Online (Sandbox Code Playgroud)
有没有一种有效的方法将其转换为2d数组的形式:
array([[1, 1, 1, 5, 5, 2, 4, 4, 4],
[3, 6, 6, 6, 6, 6, 4, 4, 4]])
Run Code Online (Sandbox Code Playgroud)
非常感谢!
unu*_*tbu 12
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.]])
Run Code Online (Sandbox Code Playgroud)
阵列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.]])
Run Code Online (Sandbox Code Playgroud)
这几乎是我们想要的,但请注意每个子数组中的值,例如
[[ 1., 5., 4.],
[ 1., 5., 4.],
[ 1., 2., 4.]]
Run Code Online (Sandbox Code Playgroud)
在前往下一行之前,从左到右行进.在进入下一列之前,我们希望沿着行前进.要实现这一点,请使用order='F'.
通常访问NumPy数组中的元素C-order- 最后一个索引移动得最快.如果我们访问元素F-order然后第一个索引移动最快.由于在2D形状的数组中(h, w),第一个轴与行相关联,最后一个轴与列相关联,F-order在向前移动到下一列之前遍历每一行的数组.