【问题标题】:Different axis indication between np.delete and np.mean in numpy array of PythonPython的numpy数组中np.delete和np.mean之间的不同轴指示
【发布时间】:2021-09-08 01:29:26
【问题描述】:

我从how is axis indexed in numpy's array学到了numpy数组的轴指示

文章说,对于二维数组,axis=0 代表数组中的每个列,axis=1 代表数组中的每一行。当我使用 np.mean 时它可以工作,这意味着按 col 的值,但 axis=0 中的 np.delete 不同,它按行删除元素。

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

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

【问题讨论】:

  • 数组的平均值恰好是第二行中的值,即(1+5+9)/3 = 5
  • @TomMcLean np.mean 按列计算值,但np.delete 按行计算。
  • 描述 1d 或 3d 数组的 axis 参数更容易。使用 2d 时,单词描述往往会令人困惑。

标签: python arrays numpy


【解决方案1】:

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

因此,轴 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 的行为会有所不同?好吧,因为删除的目的是沿某个轴删除元素,而不是在该轴上执行聚合。所以在这种特殊情况下,我们有 3 个网格。所以删除其中一个只会给我们留下 2 个网格。我们也可以删除每个网格的第二行 (axis=1)。这会给我们留下 3 个网格,但每个网格只有 1 行而不是 2 行。

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

【讨论】:

  • 感谢你写了这么多例子,并指出我的错误。
【解决方案2】:

我认为您的困惑可能来自这样一个事实:在delete 中,轴是指您在查找要删除的部分时索引的轴,而在mean 中,轴是指您所在的轴平均下来。

在这两种情况下,axis 告诉函数在尝试执行其操作时“移动”哪个轴 - 对于 delete,它在搜索删除内容时向下移动,对于 mean,它向下移动计算平均值时的方式

【讨论】:

    【解决方案3】:

    通常我喜欢将 numpy(或 pandas)中的 axis 视为轴“沿着它”进行计算的指标。

    从这个意义上说,当您计算沿轴 0 的平均值时,也就是沿行计算每一列。但是,如果您沿轴 0 删除,则意味着您沿行滚动以找到要删除的索引。

    【讨论】:

    • 我觉得@rudolfovic说的也不错,可以让我更好的理解np.meannp.delete之间的不同功能。这就是他所说的:'那么,为什么np.delete 的行为会有所不同?好吧,因为 delete 的目的是沿某个轴删除一个元素,而不是在该轴上执行聚合。'
    • delete 删除一个元素,mean 删除(缩小)一个维度。
    • 输出维度将取决于您正在执行的特定计算。例如,如果您执行np.cumsumnp.roll,则输出维度将与输入维度相同。您还可以考虑沿轴应用时将返回任意维度的函数。您可以扩展为 2 个昏暗的操作:np.apply_along_axis(lambda x: np.array([(x + 1).sum(), (x + 2).sum()]), ... 并扩展为 3 个昏暗的操作:np.apply_along_axis(lambda x: np.array([(x + 1).sum(), (x + 2).sum(), (x + 3).sum()]), ...
    • 但是axis 参数是所有这些函数中的一个选项,它会告诉你沿着你正在处理数组的哪个维度,工作是否要减少,或滚动或丢弃物品。例如,您与 np.concatenate 中的 axis 具有相同的含义。
    猜你喜欢
    • 2016-11-11
    • 2013-12-01
    • 2022-07-12
    • 1970-01-01
    • 2020-07-06
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多