Ellipsis如何与除了int和slice对象之外的索引元素进行交互?

时间:2017-10-24 20:43:58

标签: python numpy

NumPy indexing docs

  

Ellipsis扩展为进行选择所需的:个对象的数量   与x.ndim长度相同的元组。

但是,这似乎仅在其他索引参数为整数和切片对象时才成立。例如,出于None的目的,Ellipsis似乎没有计入选择元组长度:

>>> 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

1 个答案:

答案 0 :(得分:0)

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

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

>>> x = numpy.arange(9).reshape([3, 3])
>>> x[1, :]
array([3, 4, 5])

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

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

的原因
numpy.zeros([2, 2])[..., None]

扩展为

numpy.zeros([2, 2])[:, :, None]

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

类似地,布尔索引使用多个维度,这些维度对应于布尔索引本身的维数。例如,boolean scalar index使用none:

>>> x[..., False].shape
(3, 3, 0)
>>> x[:, False].shape
(3, 0, 3)
>>> x[:, :, False].shape
(3, 3, 0)

在布尔数组索引的常见情况下,它与索引的数组具有相同的形状,布尔数组将使用另一个数组的每个维度,并插入一个{ {1}}将无能为力:

...

如果要查看处理>>> 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]) 扩展和使用维度计算的源代码,请在prepare_index函数下的NumPy github存储库中查看...。查找numpy/core/src/multiarray/mapping.c变量。