我有一个以下形式的 3d numpy 数组:
array([[[ 1., 5., 4.],
[ 1., 5., 4.],
[ 1., 2., 4.]],
[[ 3., 6., 4.],
[ 6., 6., 4.],
[ 6., 6., 4.]]])
有没有一种有效的方法可以将其转换为二维数组形式:
array([[1, 1, 1, 5, 5, 2, 4, 4, 4],
[3, 6, 6, 6, 6, 6, 4, 4, 4]])
非常感谢!
最佳答案
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 将尝试 reshape arr
以塑造 (h, w)
。如果我们调用 arr.reshape(h, -1)
,那么 NumPy 会将 -1
替换为使 reshape 有意义所需的任何整数——在这种情况下, 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 顺序
访问——其中最后一个索引移动最快。如果我们访问 F-order
中的元素,那么第一个索引移动最快。由于在形状为 (h, w)
的二维数组中,第一个轴与行关联,最后一个轴与列关联,以 F 顺序
行进遍历数组在移动到下一列之前向下移动每一行。
关于python - 将 3d Numpy 数组转换为 2d,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37500804/