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
?
答案 0 :(得分:0)
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]
。
类似地,布尔索引使用多个维度,这些维度对应于布尔索引本身的维数。例如,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
变量。