Python中按索引数组为numpy数组赋值报形状不匹配错误如何解决?
问题原因
报错核心是赋值操作左右两侧的数组形状不匹配,无法通过numpy广播规则对齐:
- 你的
new_arr是形状为(200, 1)的二维数组,使用行索引[2,3,4]取值时,得到的结果形状是(3, 1) - 右侧待赋值的
old_arr[:,4](或示例里的[22,44,11])是形状为(3,)的一维数组 - numpy广播规则要求低维数组的最后维度要和高维数组的最后维度匹配,或者为1,这里一维数组的最后维度是3,高维数组最后维度是1,无法匹配,因此抛出形状不匹配错误。
解决方法
你可以根据自己的业务需求选以下任意一种方案:
- 方案1:给右侧的一维数组增加一个维度,对齐左侧的二维形状
可以用[:, np.newaxis]、reshape或者np.expand_dims实现,示例代码:# 对应你的业务场景 new_arr[old_arr[:,3]] = old_arr[:,4][:, np.newaxis] # 对应你的测试示例 new_arr[[2,3,4]] = np.array([22,44,11])[:, np.newaxis] - 方案2:索引
new_arr时明确指定列索引,让左侧取值结果变为一维,对齐右侧形状
直接指定取第0列,索引结果形状和右侧一维数组一致:# 对应你的业务场景 new_arr[old_arr[:,3], 0] = old_arr[:,4] # 对应你的测试示例 new_arr[[2,3,4], 0] = [22,44,11] - 方案3:如果
new_arr本身不需要保留二维结构,初始化时直接创建一维数组
这种情况下原有写法不需要修改即可正常运行:# 初始化一维数组 new_arr = np.ones(200) # 原有写法直接生效 new_arr[[2,3,4]] = [22,44,11] new_arr[old_arr[:,3]] = old_arr[:,4]
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

