形状不匹配:索引数组的形状无法与形状一起广播。

13
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,) 无法与形状为 (20,200) 的数组进行广播

如何修复此错误?


NumPy广播将维度从右到左对齐,而不是从左到右。 - user2357112
这个错误通常是由于混合使用numpy的索引方法造成的,请参考此答案了解类似情况。 - yatu
1个回答

13

访问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


j[:,np.newaxis] 等同于 j.reshape(-1,1)。因此,另一个答案是 sumkma[site[j], j.reshape(-1,1)]。 - cck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接