将3d Numpy数组转换为2d

时间:2016-05-28 15:26:55

标签: python numpy

我有一个以下形式的3d numpy数组:

array([[[ 1.,  5.,  4.],
    [ 1.,  5.,  4.],
    [ 1.,  2.,  4.]],

   [[ 3.,  6.,  4.],
    [ 6.,  6.,  4.],
    [ 6.,  6.,  4.]]])

是否有一种有效的方法将其转换为2d数组:

array([[1, 1, 1, 5, 5, 2, 4, 4, 4],
   [3, 6, 6, 6, 6, 6, 4, 4, 4]])

非常感谢!

1 个答案:

答案 0 :(得分: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.]])

数组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'

通常在C-order中访问NumPy数组中的元素 - 其中最后一个索引移动得最快。如果我们访问F-order中的元素,那么第一个索引移动得最快。由于在形状为(h, w)的2D数组中,第一个轴与行相关联,而最后一个轴与F-order中的数组相交,然后向下移动每一行,然后移动到下一列。< / p>