python - 将 3d Numpy 数组转换为 2d

标签 python numpy

我有一个以下形式的 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/

相关文章:

python - git log -- <file_name> 在终端上工作正常,但在 git python 中执行 g.log(file_name) 显示错误

python - 将 timedelta 转换为 float

python - 硬盘驱动器序列号可以/为什么会更改

python - 多维数组的减法运算

python - 如何在 Ubuntu 19.04 上安装 Python 3.6?

python - Django,为什么我的 jquery url View 重复?

python - 查找列表中至少相距 x 的最小 n 个值

python - 有机会让它更快吗? (numpy.einsum)

python - 如何计算计数值对的标准差

python - TypeError : src is not a numpy array, 既不是标量