2017-08-14 108 views
2

我對NumPy的高級索引有疑問。爲什麼NumPy高級索引會爲列表和numpy數組列表產生不同的結果?

我發現this的問題,但我想我的問題稍有不同。

在下面的示例中,x_array是預期結果。但是,當我嘗試與列表相同的結果是不同的。

從numpy的DOC:

高級索引被觸發時選擇對象obj是 非元組序列對象,ndarray(數據類型整數或布爾的), 或元組至少有一個序列對象或ndarray(數據類型爲 integer或bool)。有兩種類型的高級索引:整數 和布爾值。

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

這也是我期望的行爲。

+2

這是未得到清理歷史不一致原因;可能會有舊代碼期望這種行爲。 – hpaulj

+0

所以它是在上面提到的鏈接相同的問題? – Joe

+0

我在鏈接中回答的一些方法是從代碼(通過'@ Eric')引用'嵌入序列...'的序列。這個例子就像你的例子。 'vertices [idx_list],:]'明確地告訴它將idx_list應用到第1維,否則它將它視爲'索引元組'。 – hpaulj

回答

0

在它歸結爲是https://stackoverflow.com/a/40599589/7919597

提到從numpy的的索引文件結尾:

爲了保持向後兼容的數字共同使用, 基本切片也啓動如果選擇對象是包含切片對象, 省略號對象或newaxis對象的任何 非ndarray序列(例如列表),但不包含整數數組或 其他嵌入序列。

與列表中的示例觸發向後兼容邏輯的一個未記錄的部分,如在源代碼中的註釋中所描述:

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