将3d Numpy数组转换为2d

asc*_*652 5 python numpy

我有一个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在向前移动到下一列之前遍历每一行的数组.