将3D Numpy数组转换为2D

8

I have a 3d numpy array of following form:

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]])

非常感谢您!
1个回答

16
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 遍历数组会先沿着每行向下遍历,然后再进入下一列。


非常感谢@unutbu!您能稍微解释一下您的代码吗?我不太明白numpy的reshape是如何工作的。 - ascetic652

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接