Ellipsis 确实扩展为等于:s 的数量,但该数量并不总是使选择元组长度与数组的ndim 匹配的任何因素。相反,它扩展到足够的:s 以供选择元组使用数组的每个维度。
在大多数 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 不使用:
>>> 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 变量。