2017-09-08 160 views
2

我想索引一個np.array使用列表和np.array索引。但他們給出了不同的結果。numpy數組索引:列表索引和np.array索引給出不同的結果

這裏有一個例子:

import numpy as np 
x = np.arange(10) 
idx = [[0, 1], [1, 2]] 
x[np.array(idx)] # returns array([[0, 1], [1, 2]]) 

但筆直應用列表給出錯誤

x[idx] # raises IndexError: too many indices for array 

我期待以上的回報的效果與使用np.array指數。 任何想法爲什麼?

我使用python 3.5numpy 1.13.1

回答

2

如果它是一個數組,它被解釋爲包含索引的最終數組的形狀 - 但是如果它是一個列表,它就是沿「維度」(多維數組索引)的索引。

所以第一個例子(與array)等同於:

[[x[0], x[1], 
[x[1], x[2]] 

但第二個例子(list)被解釋爲:

[x[0, 1], x[1, 2]] 

x[0, 1]給人IndexError: too many indices for array因爲你x只有一個維度。

這是因爲list s的解釋,就像是一個元組,這等同於將它們在 「分開」:

 
x[[0, 1], [1, 2]] 
      ^^^^^^----- indices for the second dimension 
    ^^^^^^------------- indices for the first dimension 
+0

很好的例子。謝謝。 – xiaohan2012

+2

列表[有時](https://github.com/numpy/numpy/blob/7ccf0e08917d27bc0eba34013c1822b00a66ca6d/numpy/core/src/multiarray/mapping.c#L200)像元組對待。 – user2357112

1

numpy indexing文檔:

ndarrays可以使用標準Python x[obj]語法進行索引,其中x i s的數組和obj的選擇。當obj是切片對象(由括號內 start:stop:step符號構成),一個整數,或元組slice對象和整數 發生

...
基本切片。 Ellipsisnewaxis對象也可以是 穿插這些以及。爲了向後保持 與數字共用使用兼容,基本切片也發起 如果選擇對象是任何非ndarray序列(如 一個list)含有slice目的,Ellipsis對象,或newaxis 對象但對於整數陣列或其他嵌入序列而言不是。 ...

+0

雖然這個問題中的兩個例子都沒有觸發基本切片。該數組觸發高級索引,並且該列表觸發不同的高級索引,原因是文檔沒有充分解釋。 – user2357112