首页 > 解决方案 > Python的numpy数组中np.delete和np.mean之间的不同轴指示

问题描述

我从 numpy 数组中的轴索引方式了解了 numpy 数组的轴指示

文章说,对于二维数组,axis=0代表数组中的每个列,以及数组axis=1中的每一行。当我使用np.meancol 表示值时它起作用,但np.deleteaxis=0行删除元素时不同。

import numpy as np

arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
'''
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
'''
np.mean(arr, 0)
'''
array([5., 6., 7., 8.])
'''
np.delete(arr,1,axis=0)
'''
array([[ 1,  2,  3,  4],
       [ 9, 10, 11, 12]])
'''

我很困惑我是否理解错了?为什么声明np.meannp.delete在不同的轴上运行axis=0

标签: pythonarraysnumpy

解决方案


您链接到的问题的公认答案实际上正确地说

因此,轴 0 是第一个维度(“行”),轴 1 是第二个维度(“列”)

这就是代码的作用,与你所说的相反。

这应该是你困惑的根源。正如我们从您自己的示例中看到的那样:

np.delete(arr,1,axis=0)
'''
array([[ 1,  2,  3,  4],
       [ 9, 10, 11, 12]])
'''

索引 1 处的行被删除,这正是我们想要发生的。

这是一个 2D 示例,其中我们有行和列,但重要的是要了解形状的一般工作原理,然后它们将在更高维度上有意义。考虑以下示例:

[
  [
    [1, 2],
    [3, 4]
  ],
  [
    [5, 6],
    [7, 8],
  ],
  [
    [9, 10],
    [11, 12],
  ]
]

在这里,我们有 3 个网格,每个网格本身都是 2x2,所以我们有一些形状为 3x2x2 的东西。这就是为什么我们总共有 12 个元素。现在,我们怎么知道axis=0我们有 3 个元素?因为如果你把它看作一个简单的数组而不是一些花哨的numpy对象len(arr) == 3。然后,如果您沿该轴取任何元素(即任何“网格”),我们将看到它们的长度为 2 或len(arr[0]) == 2。那是因为每个网格都有 2 行。最后,要检查每个网格的每一行有多少项目,我们只需要检查这些行中的任何一个。让我们看看第一个网格的第二行是否有变化。我们会看到:len(arr[0][1]) == 2.

现在,是什么np.mean(a, axis=0)意思?这意味着我们将检查每个项目axis=0并找到它们的平均值。如果这些项目只是数字(如果a=np.array([1,2,3])),那很容易,因为平均值1,2,3只是这些数字的总和除以它们的数量。

那么,如果我们有向量或网格呢?[2,4,6]和的平均值是[0,0,0]多少?惯例是这些到列表的平均值是每个索引的平均值列表。换句话说,它是:

[np.mean([2,0]), np.mean([4,0]), np.mean([6,0])]

这是微不足道的[1,2,3]

那么,为什么会有不同的np.delete行为呢?好吧,因为 delete 的目的是沿某个轴删除一个元素,而不是在该轴上执行聚合。所以在这个特殊情况下,我们有 3 个网格。所以删除其中一个只会给我们留下 2 个网格。我们也可以删除每个网格的第二行 ( axis=1)。这会给我们留下 3 个网格,但每个网格只有 1 行而不是 2 行。

希望这能带来一些清晰:)


推荐阅读