<p>Case1,<code>a[l]</code>实际上是<code>a[(l,)]</code>,它扩展为<code>a[(l, slice(None))]</code>。也就是说,用列表<code>l</code>和自动尾随的<code>:</code>片索引第一个维度。索引以元组的形式传递给数组<code>__getitem__</code>,并且可以不加混淆地添加额外的<code>()</code>。在</p>
<p>情况2,<code>a[j]</code>被视为<code>a[array([0, 1]), array([0, 1]]</code>或{<cd10>}。换句话说,作为索引对象的元组,每个维度一个。最后返回<code>a[0,0]</code>和{<cd12>}。在</p>
<p>Case3,<code>a[j1]</code>是<code>a[(j1, slice(None))]</code>,只对第一个维度应用<code>j1</code>索引。在</p>
<p>案例2有点反常。您的直觉是正确的,但是由于历史原因,这个数组列表(或列表列表列表)被解释为数组的元组。在</p>
<p>这已经在其他SO问题中讨论过了,我认为这是有记录的。但我现在找不到那些参考资料。在</p>
<p>因此,使用索引对象的元组或数组更安全。用列表编制索引有潜在的歧义。在</p>
<hr/>
<p><a href="https://stackoverflow.com/questions/46116568/numpy-array-indexing-list-index-and-np-array-index-give-different-result">numpy array indexing: list index and np.array index give different result</a></p>
<p>这个问题涉及到了同一个问题,尽管对所发生的事情的最清晰的陈述隐藏在@user2357112的评论中的代码链接中。在</p>
<p>另一种强制Case3类索引的方法是显式地生成第二维度切片<code>a[j,:]</code></p>
<pre><code>In [166]: a[j]
Out[166]: array([1, 4])
In [167]: a[j,:]
Out[167]:
array([[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]]])
</code></pre>
<p>(我经常包括尾随<code>:</code>,即使不需要它。这让我和读者都清楚地知道,我们在处理多少个维度。)</p>