【问题标题】:How does Ellipsis interact with index elements other than ints and slice objects?Ellipsis 如何与除 int 和 slice 对象以外的索引元素交互?
【发布时间】:2017-10-25 04:43:57
【问题描述】:

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

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    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.cprepare_index 函数的NumPy github 存储库中。查找used_ndim 变量。

    【讨论】:

      猜你喜欢
      • 2017-12-19
      • 2021-08-19
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      相关资源
      最近更新 更多