web-dev-qa-db-ja.com

形状の不一致:インデックス配列は形状と一緒にブロードキャストできませんでした

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:形状の不一致:配列のインデックス付けは、形状(20,200)(20、)と一緒にブロードキャストできませんでした

エラーを修正する方法は?

10
kinder chen

整数型の他の多次元配列を使用して数の多い多次元配列にアクセスする場合、インデックスに使用される配列は同じ形状である必要があります。

可能な場合、Numpyは喜んでブロードキャストしますが、それを可能にするために、配列は同じ次元である必要があります。これは機能します:

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

np.newaxisの結果はj[:,np.newaxis]が2次元になります(形状は(20,1)になり、jの形状は1次元(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

8
tmbo