我对NumPy的高级索引有疑问。
我发现了this个问题,但我想我的问题略有不同。
在下面的示例中,x_array
是预期的结果。但是当我尝试使用列表时,结果却不同。
来自numpy doc:
当选择对象obj为a时,将触发高级索引 非元组序列对象,ndarray(数据类型为integer或bool), 或者具有至少一个序列对象或ndarray(数据类型的元组)的元组 整数或布尔)。高级索引有两种类型:整数 和布尔。
import numpy as np
vertices = np.arange(9).reshape((3,3))
idx_list = [[0, 1, 2],
[0, 2, 1]]
x_list = vertices[idx_list]
print('list')
print(x_list)
#this works as expected
idx_array = np.array(idx_list)
x_array = vertices[idx_array]
print('array')
print(x_array)
idx_list
应该触发高级索引,因为它是一个"非元组序列对象?"或者这里是一个列表和一个元组,它是"一个至少有一个序列对象的元组"
使用列表产生的效果与传递方括号内的逗号分隔的两个列表条目(每个维度一个)相同。
x_list_2 = vertices[idx_list[0], idx_list[1]]
这也是我期望的行为。
答案 0 :(得分:0)
最后归结为https://stackoverflow.com/a/40599589/7919597
中提到的内容来自numpy的索引文档:
为了保持向后兼容数字中的常见用法, 如果选择对象是任何对象,也会启动基本切片 包含切片对象的非ndarray序列(如列表) 省略号对象或newaxis对象,但不适用于整数数组或 其他嵌入序列。
列表示例触发了向后兼容逻辑的未记录部分,如源代码中的注释中所述:
/*
* 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]]`)
*/