如何在不使用 NumPy 复制的情况下展平多维数组的轴?

Posted

技术标签:

【中文标题】如何在不使用 NumPy 复制的情况下展平多维数组的轴?【英文标题】:How to flatten axes of a multidimensional array without making copies in NumPy? 【发布时间】:2012-04-20 13:41:16 【问题描述】:

我想知道是否有一种方法可以沿给定轴展平多维数组(即 ndarray 类型),而无需在 NumPy 中复制。例如,我有一个二维图像数组,我希望将每个图像展平为一个向量。因此,一种简单的方法是numpy.array([im.flatten() for im in images]),但这会创建每个副本。

【问题讨论】:

【参考方案1】:

ravel它:

>>> a = numpy.arange(25).reshape((5, 5))
>>> b = a.ravel()
>>> b[0] = 55
>>> a
array([[55,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

或者reshape它:

>>> a = numpy.arange(27).reshape((3, 3, 3))
>>> b = a.reshape((9, 3))
>>> b[0] = 55
>>> a
array([[[55, 55, 55],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

在大多数情况下,它们都返回原始数组的视图,而不是副本。

【讨论】:

谢谢! reshape 为我做了诀窍。我之前认为它会破坏我的二维矩阵和向量之间的一对一映射。但不,它奏效了!【参考方案2】:

如果您不知道输入数组的形状:

images.reshape((images.shape[0], -1))

-1 告诉 reshape 计算剩余的尺寸。这假设您 想要展平图像的第一个轴。

【讨论】:

以上是关于如何在不使用 NumPy 复制的情况下展平多维数组的轴?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不循环的情况下展平一个简单的数组?

我可以在不创建新列表/数组的情况下展平数组吗? [复制]

如何在 PHP 中将多维数组“展平”为简单数组? [复制]

如何在 PHP 中将多维数组“展平”为简单数组? [复制]

Numpy 数组:连接展平和添加维度

如何展平 numpy 数组的最后两个维度? [复制]