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

Posted

技术标签:

【中文标题】形状不匹配:索引数组无法与形状一起广播【英文标题】:shape mismatch: indexing arrays could not be broadcast together with shapes 【发布时间】:2018-02-17 20:26:40 【问题描述】:
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,)

如何修复错误?

【问题讨论】:

NumPy 广播将维度从右到左对齐,而不是从左到右。 这个错误一般是在混合numpy的索引方法时出现的,类似情况见this answer 【参考方案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

【讨论】:

以上是关于形状不匹配:索引数组无法与形状一起广播的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:操作数无法与形状一起广播 (2501,201) (2501,)

ValueError:操作数无法与形状一起广播 - inverse_transform- Python

形状不匹配:无法将对象广播到单个形状如何解决python中的此类错误?

ValueError:形状 (3,1) 的不可广播输出操作数与广播形状 (3,4) 不匹配

SVR ValueError:形状为 (1,1) 的不可广播输出操作数与广播形状 (1,9) 不匹配

Python ValueError:形状不匹配:无法将对象广播到单个形状