2017-09-08 19 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は喜んでブロードキャストしますが、可能であれば、配列はが同じ次元を持つ必要があります。j[:,np.newaxis]np.newaxis結果は二次元である

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

jの形状は(20,)一次元であるのに対し形状は、今(20,1)ある):この作品。それは今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

関連する問題