2015-06-03 61 views
0

我有3維的ndarray。 如何從第一軸選擇索引0和1,同時從第二軸選擇索引0和3,從第三軸選擇索引1?numpy ndarray高級索引

我試圖使用索引[(0,1),(1,3),1],這產生了一個完全不同於我認爲會產生的結果。

所以這裏有兩個問題。 [(0,1),(1,3),1]做什麼? 以及如何正確創建解決我原來的問題的索引。

a = np.arange(30).reshape(3, 5, 2) 
array([[[ 0, 1], 
     [ 2, 3], 
     [ 4, 5], 
     [ 6, 7], 
     [ 8, 9]], 

     [[10, 11], 
     [12, 13], 
     [14, 15], 
     [16, 17], 
     [18, 19]], 

     [[20, 21], 
     [22, 23], 
     [24, 25], 
     [26, 27], 
     [28, 29]]]) 

a[0, (1, 3), 1] # produces array([3, 7]) 
a[(0,1), (1, 3), 1] # produces array([ 3, 17]) 

```

+0

...,什麼是你期望的輸出? –

回答

1

當你索引你這樣做的方式,NumPy的不把它解釋爲選擇每個維度的那些指標。相反,NumPy的廣播相對於彼此的參數:

a[(0,1), (1, 3), 1] -> a[array([0, 1]), array([1, 3]), array([1, 1])] 

,然後創建結果陣列,其中a[i, j, k][x] == a[i[x], j[x], k[x]]

要獲得您要查找的行爲,您需要重新設計您傳遞的參數,以便相互廣播它們會生成一個形狀爲(2, 2)而不是形狀爲(2,)的數組。這意味着第一個參數需要形狀(2, 1),第二個參數需要形狀(1, 2)(2,),第三個參數的形狀很好。 numpy.ix_可以使這更容易,但它不支持標量參數。 a[np.ix_([0, 1], [1, 3], [1])]做什麼,你會預期a[[0, 1], [1, 3], [1]]做,而是讓你會從a[[0, 1], [1, 3], 1]預期的形狀,你的選擇是混亂:

>>> a[np.ix_([0, 1], [1, 3], [1])] 
array([[[ 3], 
     [ 7]], 

     [[13], 
     [17]]]) 
>>> a[np.ix_([0, 1], [1, 3]) + (1,)] 
array([[ 3, 7], 
     [13, 17]]) 
>>> a[np.ix_([0, 1], [1, 3], [1])][:, :, 0] 
array([[ 3, 7], 
     [13, 17]]) 
+0

謝謝,解釋。我剛剛讀到了有關廣播節目的內容。 ix_函數看起來不錯,似乎滿足我需要的東西。 –