numpy 索引:尾随省略号不应该是多余的吗?

2023-12-10

在尝试正确理解 numpy 索引规则时,我偶然发现了以下内容。我曾经认为索引中的尾随省略号没有任何作用。是不是很琐碎?但事实并非如此:

Python 3.5.2 (default, Nov 11 2016, 04:18:53) 
[GCC 4.8.5] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> 
>>> D2 = np.arange(4).reshape((2, 2))
>>>
>>> D2[[1, 0]].shape; D2[[1, 0], ...].shape
(2, 2)
(2, 2)
>>> D2[:, [1, 0]].shape; D2[:, [1, 0], ...].shape
(2, 2)
(2, 2)
>>> # so far so expected; now
... 
>>> D2[[[1, 0]]].shape; D2[[[1, 0]], ...].shape
(2, 2)
(1, 2, 2)
>>> # ouch!
...
>>> D2[:, [[1, 0]]].shape; D2[:, [[1, 0]], ...].shape
(2, 1, 2)
(2, 1, 2)

现在,知情者可以告诉我这是一个错误还是一个功能吗? 如果是后者,其理由是什么?

提前致谢, 保罗


显然,该条的解释存在一定的歧义[[1, 0]]指数。可能这里讨论的是同样的事情:

在 numpy 中传递列表而不是元组时的高级切片

我会尝试一个不同的数组,看看它是否能让事情变得清晰

In [312]: D2=np.array([[0,0],[1,1],[2,2]])
In [313]: D2
Out[313]: 
array([[0, 0],
       [1, 1],
       [2, 2]])

In [316]: D2[[[1,0,0]]]
Out[316]: 
array([[1, 1],
       [0, 0],
       [0, 0]])
In [317]: _.shape
Out[317]: (3, 2)

Use of : or ...或者将索引列表设为数组,都将其视为 (1,3) 索引,并相应扩展结果的维度

In [318]: D2[[[1,0,0]],:]
Out[318]: 
array([[[1, 1],
        [0, 0],
        [0, 0]]])
In [319]: _.shape
Out[319]: (1, 3, 2)
In [320]: D2[np.array([[1,0,0]])]
Out[320]: 
array([[[1, 1],
        [0, 0],
        [0, 0]]])
In [321]: _.shape
Out[321]: (1, 3, 2)

请注意,如果我将转置应用于索引数组,我会得到 (3,1,2) 结果

In [323]: D2[np.array([[1,0,0]]).T,:]
...
In [324]: _.shape
Out[324]: (3, 1, 2)

Without : or ...,它似乎剥去了一层[]在将其应用到第一个轴之前:

In [330]: D2[[1,0,0]].shape
Out[330]: (3, 2)
In [331]: D2[[[1,0,0]]].shape
Out[331]: (3, 2)
In [333]: D2[[[[1,0,0]]]].shape
Out[333]: (1, 3, 2)
In [334]: D2[[[[[1,0,0]]]]].shape
Out[334]: (1, 1, 3, 2)
In [335]: D2[np.array([[[[1,0,0]]]])].shape
Out[335]: (1, 1, 1, 3, 2)

我认为这里存在向后兼容性问题。我们知道元组层是“冗余的”:D2[(1,2)]是相同的D2[1,2]。但为了兼容早期版本numpy (numeric)首先[]层可以以相同的方式处理。

在 11 月的问题中,我指出:

因此,在顶层,列表和元组被视为相同 - 如果列表不能解释为高级索引列表。

添加一个...是另一种分离的方式D2[[[0,1]]] from D2[([0,1],)].

From @eric/s拉取请求seburg解释

元组标准化是一件相当小的事情(它基本上检查长度

[[1,2]]是一个带有列表的 1 元素列表,因此它被视为一个元组,即([1,2],). [[1,2]],...已经是一个元组了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

numpy 索引:尾随省略号不应该是多余的吗? 的相关文章

随机推荐