形状不匹配:索引数组不能与形状一起广播

kin*_*hen 7 python indexing numpy broadcast

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)]
Run Code Online (Sandbox Code Playgroud)

这有效,但我不想使用for循环.当我尝试

sumkma[site[j],j]
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

IndexError:形状不匹配:索引数组不能与形状一起广播(20,200)(20,)

如何修复错误?

tmb*_*mbo 8

当访问具有整数类型的其他多维数组的numpy多维数组时,用于索引的数组需要具有相同的形状.

如果可能的话,Numpy会愉快地播出 - 但为了这个可能,阵列需要具有相同的维度,例如这有效:

sumkma[site[j], j[:,np.newaxis]]
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

索引数组的相同维度允许numpy将它们广播为具有相同的形状(20,200).

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