[[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)
使用:
or ...
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)
如果没有:
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 月的那个问题中,我指出:
因此,在顶层,列表和元组被视为相同 - 如果列表不能解释为高级索引列表。
添加 a...
是另一种分离D2[[[0,1]]]
from 的方法D2[([0,1],)]
。
从@eric/s
拉请求seburg
解释
元组规范化是一件相当小的事情(它基本上检查长度 <= np.MAXDIMS 的非数组序列,如果它包含另一个序列,切片或 None 认为它是一个元组)。
[[1,2]]
是一个带有列表的 1 元素列表,因此它被视为一个元组,即([1,2],)
. [[1,2]],...
已经是一个元组了。