python - Python的numpy数组中np.delete和np.mean之间的不同轴指示
问题描述
我从 numpy 数组中的轴索引方式了解了 numpy 数组的轴指示
文章说,对于二维数组,axis=0
代表数组中的每个列,以及数组axis=1
中的每一行。当我使用np.mean
col 表示值时它起作用,但np.delete
按axis=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.mean
时np.delete
在不同的轴上运行axis=0
?
解决方案
您链接到的问题的公认答案实际上正确地说
因此,轴 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 行。
希望这能带来一些清晰:)
推荐阅读
- python - 在嵌入式 Flinkrunner (apache_beam [GCP]) 中使用 pub/sub io 运行光束流管道 (Python) 时出错
- django - 自定义 Django 管理员搜索
- jquery - 为什么这个函数不会将页面加载到 div 中?(jQuery AJAX)
- c# - Visual Studio 2019 中的 SQL Server 数据库
- c++ - 如何在 vs 代码“C++”中安装和运行 boost 库
- c++ - U 没有命名类型 - 模板编译错误
- python-3.x - 更改时间列的数据类型-Pandas
- r - “上面列出了初始化中遇到的错误”(R)
- javascript - react-js中如何从组件中取出props数据?
- python - Scipy 和 Sklearn Yeo-Johnson 归一化结果不匹配