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

Eri*_*ric 5 python numpy

在文档中,它说(强调我的):

当选择对象obj是非元组序列对象,ndarray(数据类型为integer或bool)或具有至少一个序列对象或ndarray(数据类型为integer或bool)的元组时,将触发高级索引.高级索引有两种类型:整数和布尔值.

<剪断>

还要认识到x[[1,2,3]]会触发高级索引,x[[1,2,slice(None)]]会触发基本切片.

我知道为什么x[(1, 2, slice(None))]触发基本切片.但是x[[1,2,slice(None)]],当[1,2,slice(None)]满足作为非元组序列的条件时,为什么会触发基本切片?


在相关的说明中,为什么会发生以下情况?

>>> a = np.eye(4)
>>> a[(1, 2)]  # basic indexing, as expected
0.0
>>> a[(1, np.array(2))] # basic indexing, as expected
0.0

>>> a[[1, 2]]  # advanced indexing, as expected
array([[ 0.,  1.,  0.,  0.],
   [ 0.,  0.,  1.,  0.]])
>>> a[[1, np.array(2)]]  # basic indexing!!??
0.0
Run Code Online (Sandbox Code Playgroud)

use*_*ica 8

该规则有一个例外.高级索引文档部分没有提到它,但在上面,在基本切片和索引部分的开头附近,您将看到以下文本:

为了保持向后兼容Numeric中的常见用法,如果选择对象是包含切片对象,Ellipsis对象或newaxis对象的任何非ndarray序列(例如列表),则也会启动基本切片,但不是整数数组或其他嵌入序列.


a[[1, np.array(2)]]并不能完全触发基本索引.它会触发向后兼容逻辑的未记录部分,如源代码中的注释所述:

    /*
     * Sequences < NPY_MAXDIMS with any slice objects
     * or newaxis, Ellipsis or other arrays or sequences
     * embedded, are considered equivalent to an indexing
     * tuple. (`a[[[1,2], [3,4]]] == a[[1,2], [3,4]]`)
     */
Run Code Online (Sandbox Code Playgroud)

np.array(2)名单内引起仿佛它是一个元组,待处理的名单,但结果a[(1, np.array(2))]仍是一种先进的索引操作.它最终应用12分离轴,不像a[[1, 2]],结果看起来相同a[1, 2],但如果你尝试使用3D a,它会产生一个副本而不是视图.