Ellipsis扩展到与x.ndim长度相同的选择元组所需的:对象数。
然而,这似乎只适用于其他索引参数是ints和片对象时。例如,为了实现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?
发布于 2017-10-24 20:43:57
Ellipsis确实展开为等效于多个:,但这个数字并不总是使选择元组长度与数组的ndim匹配。相反,它扩展到足够多的:,以便选择元组使用数组的每个维度。
在大多数NumPy索引中,所选元组的每个元素与原始数组的某个维度相匹配。例如,在
>>> x = numpy.arange(9).reshape([3, 3])
>>> x[1, :]
array([3, 4, 5])1匹配到x的第一个维度,:匹配到第二个维度。1和:使用这些维度。
但是,索引元素并不总是使用一个数组维度。如果索引元素不对应于输入维度或多个输入维度,则该索引元素将使用输入的多个维度。例如,None在输出中创建一个与输入的任何维度不相对应的新维度。None不使用输入维度,这就是为什么
numpy.zeros([2, 2])[..., None]扩展到
numpy.zeros([2, 2])[:, :, None]而不是numpy.zeros([2, 2])[:, None]。
类似地,布尔索引使用与布尔索引本身的维数相对应的若干维数。例如,布尔标量指数使用none:
>>> x[..., False].shape
(3, 3, 0)
>>> x[:, False].shape
(3, 0, 3)
>>> x[:, :, False].shape
(3, 3, 0)在布尔数组索引与其索引的数组形状相同的常见情况下,布尔数组将使用其他数组的每个维度,插入一个...将什么也不起作用:
>>> 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变量。
https://stackoverflow.com/questions/46919690
复制相似问题