python - 为什么 Numpy 中的数组索引会产生这个结果?
问题描述
根据numpy 文档,将数组索引指定为array_name[x, y]
和array_name[x][y]
是等效的,并且应该产生相同的结果。但是,下面的代码片段:
import numpy as np
a = np.empty((7, 8, 9), dtype = object)
# First indexing notation
print(a[:, 0, 0].shape, a[0, :, 0].shape, a[0, 0, :].shape)
# Second indexing notation
print(a[:][0][0].shape, a[0][:][0].shape, a[0][0][:].shape)
产生输出:
(7,) (8,) (9,)
(9,) (9,) (9,)
分别,显然是不等价的。是什么赋予了?
解决方案
您误解了 numpy 如何解释索引/切片。使用类似的东西a[x, y, z]
,numpy 用于x
沿第一个y
维度、第二个维度和z
第三个维度进行选择。
但是,对于类似的东西a[x][y][z]
,numpyx
沿 的第一个维度a
使用,它y
沿 的第一个维度使用a[x]
,并z
沿 的第一个维度使用a[x][y]
。
如果您将使用:
与使用某个数字进行比较,这可能会令人困惑。为什么会这样?一种是切片 ( :
),另一种是索引 (no :
)。因为沿维度切片(使用:
)实际上并没有减少数组的维度,而索引却可以。
可以有很多例子来表示这一点,但我认为你最好在 ipython 中玩一个数组,看看不同的索引和切片如何影响输出。但是,我将提供一两个专门的示例来回答您的问题
import numpy as np
a = np.arange(2*3*4).reshape((2,3,4))
a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
# First indexing notation
print(a[:, 0, 0].shape, a[0, :, 0].shape, a[0, 0, :].shape)
# Prints (2,) (3,), (4,)
打破这一点,我们采取每一个:
a[:, 0, 0]
获取所有第一个维度,以及0
第二个和第三个维度的第 th 个元素。a[0, :, 0]
取0
第一个维度的第 th 个元素,第二个维度的所有0
元素,以及第三个维度的第 th 个元素。a[0, 0, :]
将0
第 th 个元素用于第一维和第二维,并将所有元素用于第三维。
# Second indexing notation
print(a[:][0][0].shape, a[0][:][0].shape, a[0][0][:].shape)
# Prints (4,) (4,) (4,)
在这种情况下:
a[:]
基本相同a
(返回一个新view
的矩阵——谷歌“numpy view”获取更多信息)。由于a[:]
与 相同a
,a[:][0]
选择沿第一个维度的0
元素a
- ETC...
OP 说:
根据numpy 文档,将数组索引指定为 array_name[x, y] 和 array_name[x][y] 是等效的
这是真实的!要认识到的主要事情是(尽管相关)索引和切片不是一回事(正如我在上面指出的那样)。
推荐阅读
- python - 如何使 SHAP 的 DeepExplainer 与 deepctr 库一起使用
- javascript - API 请求在 react-app 中使用 redux-saga 失败
- php - 允许用户在 PHP 中使用一些静态值创建自定义段落
- typescript - 如何转换“|” 至 ”&”
- android - 使选项卡布局指示器小于选项卡标题
- ruby-on-rails - 在字符串 ruby 中提取带分隔点的数字
- ms-access - 报告的多个实例中缺少数据
- javascript - 如何将数据推送到 Firestore 中的嵌套数组中?
- java - “MainActivity”是一种特殊的活动,它与其他活动有什么不同吗?
- html - 如何使闪烁按钮出现在文本之后