2017-02-22 80 views
2
import numpy as np 
a = np.zeros((10,20,30)) 

爲了提取在第二和第三維中的元素,IND1和IND2是指數numpy的陣列多維索引與列表IndexError:形狀失配

ind1 = [0,5,6] 
ind2 = [1,2,7,8] 
a[:,ind1,ind2] 

上述命令的列表給出了一個IndexError:形狀失配

如果我們做索引如下

a1 = a[:,ind1,:] 
a2 = a1[:,:,ind2] 

它的工作原理,如果迪ind1和ind2的大小相同,則索引工作。

對於多維數組,索引列表是否有必要具有相同的形狀?

回答

1

由於輸出的形狀是由索引數組的形狀決定的,所以它們必須相同。

或者說兼容,下面

i1, i2 = np.ix_(ind1, ind2) 
a[:, i1, i2] 

會工作。它通過選取ind1,ind2的所有組合(i1,i2是形狀(3,1)(1,4),從而它們一起廣播)來產生10x3x4陣列。

相比之下,「正常」行爲(ind1和ind2不可廣播時)只是挑選ind1和ind2的相應元素,這就是它們的形狀必須一致的原因。

這裏有一個簡單的例子,以示區別

>>> z = np.zeros((5,5), int) 
>>> a = [1,2,4] 
>>> z[a,a] = 1 
>>> z # 3 points set 
array([[0, 0, 0, 0, 0], 
     [0, 1, 0, 0, 0], 
     [0, 0, 1, 0, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 1]]) 
>>> a1,a2 = np.ix_(a,a) 
>>> z[a1,a2] = 1 
>>> z # 3x3 points set 
array([[0, 0, 0, 0, 0], 
     [0, 1, 1, 0, 1], 
     [0, 1, 1, 0, 1], 
     [0, 0, 0, 0, 0], 
     [0, 1, 1, 0, 1]]) 
1

保羅的答案很可能回答你的問題,但我發現,它不會,如果你的工作,因爲你是在同一時間使用這些指標做兩做到以下幾點:

a[:,ind1,:][:,:,ind2] 

它沒有得到指數誤差

+0

好的技巧。應該給與'np.ix_'方法相同的輸出。當然,'np.ix_'通常會更有效率,但是你的輸入更少。 –

+0

@PaulPanzer是的,我希望你的解決方案是numpy的創造者首選的方法:p – Harlekuin