首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ellipsis如何与ints和片对象以外的索引元素交互?

Ellipsis如何与ints和片对象以外的索引元素交互?
EN

Stack Overflow用户
提问于 2017-10-24 20:43:57
回答 1查看 131关注 0票数 0

NumPy索引文档

Ellipsis扩展到与x.ndim长度相同的选择元组所需的:对象数。

然而,这似乎只适用于其他索引参数是ints和片对象时。例如,为了实现None的目的,Ellipsis似乎不考虑选择元组长度

代码语言:javascript
复制
>>> import numpy
>>> numpy.zeros([2, 2]).shape
(2, 2)
>>> numpy.zeros([2, 2])[..., None].shape
(2, 2, 1)
>>> numpy.zeros([2, 2])[:, None].shape
(2, 1, 2)
>>> numpy.zeros([2, 2])[:, :, None].shape
(2, 2, 1)

布尔索引也可以观察到类似的奇数效应,这些索引可以算作多个元组元素,也可以完全不算。

在一般情况下,NumPy如何扩展Ellipsis

EN

回答 1

Stack Overflow用户

发布于 2017-10-24 20:43:57

Ellipsis确实展开为等效于多个:,但这个数字并不总是使选择元组长度与数组的ndim匹配。相反,它扩展到足够多的:,以便选择元组使用数组的每个维度。

在大多数NumPy索引中,所选元组的每个元素与原始数组的某个维度相匹配。例如,在

代码语言:javascript
复制
>>> x = numpy.arange(9).reshape([3, 3])
>>> x[1, :]
array([3, 4, 5])

1匹配到x的第一个维度,:匹配到第二个维度。1:使用这些维度。

但是,索引元素并不总是使用一个数组维度。如果索引元素不对应于输入维度或多个输入维度,则该索引元素将使用输入的多个维度。例如,None在输出中创建一个与输入的任何维度不相对应的新维度。None不使用输入维度,这就是为什么

代码语言:javascript
复制
numpy.zeros([2, 2])[..., None]

扩展到

代码语言:javascript
复制
numpy.zeros([2, 2])[:, :, None]

而不是numpy.zeros([2, 2])[:, None]

类似地,布尔索引使用与布尔索引本身的维数相对应的若干维数。例如,布尔标量指数使用none:

代码语言:javascript
复制
>>> x[..., False].shape
(3, 3, 0)
>>> x[:, False].shape
(3, 0, 3)
>>> x[:, :, False].shape
(3, 3, 0)

在布尔数组索引与其索引的数组形状相同的常见情况下,布尔数组将使用其他数组的每个维度,插入一个...将什么也不起作用:

代码语言:javascript
复制
>>> x.shape
(3, 3)
>>> (x < 5).shape
(3, 3)
>>> x[x<5]
array([0, 1, 2, 3, 4])
>>> x[..., x<5]
array([0, 1, 2, 3, 4])

如果您希望看到处理...展开和使用维度计算的源代码,那么它位于numpy/core/src/multiarray/mapping.c下的prepare_index函数的NumPy github存储库中。查找used_ndim变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46919690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档