在文档中,它说(强调我的):
当选择对象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)
该规则有一个例外.高级索引文档部分没有提到它,但在上面,在基本切片和索引部分的开头附近,您将看到以下文本:
为了保持向后兼容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))]仍是一种先进的索引操作.它最终应用1和2分离轴,不像a[[1, 2]],结果看起来相同a[1, 2],但如果你尝试使用3D a,它会产生一个副本而不是视图.