为什么NumPy高级索引会为列表列表和numpy数组产生不同的结果?

时间:2017-08-14 13:36:06

标签: python numpy

我对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]] 

这也是我期望的行为。

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]]`)
 */