2017-09-08 44 views
0
j=np.arange(20,dtype=np.int) 
site=np.ones((20,200),dtype=np.int) 
sumkma=np.ones((100,20)) 

[sumkma[site[x],x] for x in range(20)] 

這可以工作,但我不想用for循環。當我嘗試形狀不匹配:索引陣列不能與形狀一起廣播

sumkma[site[j],j] 

我得到這個錯誤:

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (20,200) (20,)

如何修正這個錯誤?

+0

您期望的輸出形狀是什麼? – tmbo

+0

我期望(20,200) –

+0

NumPy廣播從右到左對齊尺寸,而不是從左到右。 – user2357112

回答

1

當使用其他整數類型的多維數組訪問numpy多維數組時,用於索引的數組需要具有相同的形狀。

如果可能的話,Numpy會很高興地進行廣播 - 但爲了可能,陣列需要具有相同的維度,例如,此工作原理:

sumkma[site[j], j[:,np.newaxis]] 

np.newaxis導致j[:,np.newaxis]是二維(現在形狀(20,1),而的j形狀是一維的(20,))。現在具有的形狀可被廣播到的site[j]形狀:

>>> j.shape 
(20,) 
>>> site[j].shape 
(20,200) 
>>> j[:,np.newaxis].shape 
(20,1) 

爲索引陣列相同維度允許numpy的廣播他們具有相同的形狀(20,200)

https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html#indexing-multi-dimensional-arrays

相關問題