numpy布尔索引赋值向量对象时2D正常1D报错的解决方法
错误原因
你遇到的报错本质是numpy赋值时的自动类型推断歧义,核心逻辑如下:
- 你初始化的
a是shape=(2,)的一维object数组,使用a[True, True]索引时,两个布尔值会分别广播到两个轴,最终得到shape=(1,2)的二维数组视图。 - 赋值时numpy会优先尝试将右侧列表
b转换为数值型数组:- 第一个示例中
b的两个元素shape为(1,3)和(2,4),前两个维度均不匹配,numpy无法合并为数值数组,只能转为shape=(2,)的object数组,刚好可以广播匹配(1,2)的左值,因此赋值成功。 - 第二个示例中
b的两个元素第一个维度均为1,numpy会尝试将它们堆叠为(2,1,...)的数组,此时第二个维度长度不一致无法合并,就会抛出维度不匹配的错误。
- 第一个示例中
解决方案
方案1:显式指定右侧为object数组
强制numpy不要尝试将b合并为数值数组,直接作为object元素赋值:
a = np.array([None] * 2) b = [np.ones(shape=[1, 3]), np.ones(shape=[1, 4])] a[True, True] = np.array(b, dtype=object)
方案2:简化索引避免广播歧义
如果你只是要给a的所有元素赋值,直接使用一维索引即可,不需要加多余的布尔索引:
a = np.array([None] * 2) b = [np.ones(shape=[1, 3]), np.ones(shape=[1, 4])] a[:] = b
内容的提问来源于stack exchange,提问作者Jasper Uijlings
相关产品推荐
相关产品推荐

