Python中按指定位置赋值sigma时出现数组形状不匹配错误求助
问题分析与解决
问题描述
尝试根据J指定的位置,将V中的值赋值给sigma,但出现数组形状不匹配的错误,相关代码、错误信息及预期输出如下:
原代码
import numpy as np J=[1,3,6,7] arsigma=[] V=[[], [0.9977806946852882], [0.5778527989444576], [0.5533588101522955]] sigma=[np.array([[0.02109], [0.02109], [0.02109], [0.02109], [0.02109], [0.02109], [0.02109], [0.02109], [0.02109], [0.02109], [0.02109], [0.02109]])] for i in range(0,len(J)): for j in J: sigma[0][j]=V[i] arsigma.append(sigma) sigma=list(arsigma)
错误信息
line 27, in <module> sigma[0][j]=V[i] ValueError: could not broadcast input array from shape (0,) into shape (1,)
预期输出
[np.array([[0.02109], [0.02109], [0.02109], [0.9977806946852882], [0.02109], [0.02109], [0.5778527989444576], [0.5533588101522955], [0.02109], [0.02109], [0.02109], [0.02109]])]
错误原因
- 形状不匹配:
V的第一个元素是空列表,当i=0时尝试将空列表赋值给sigma[0][j],空列表的形状是(0,),而sigma的每个元素是形状(1,)的数组,无法完成广播赋值,直接触发错误。 - 循环逻辑混乱:嵌套循环会重复遍历
J的所有位置多次,且每次循环后将sigma添加到arsigma再重新赋值给sigma,导致sigma变成多层嵌套的列表,后续操作彻底偏离预期。 - 对应关系错误:从预期输出看,
J中的1位置并未修改,说明V的空列表是无效输入,实际需要将J的3、6、7位置与V的后三个值一一对应。
修正代码
import numpy as np # 保留需要修改的位置(对应预期输出中的修改点) J = [3, 6, 7] # 去掉无效空列表,保留需要赋值的数值 V = [0.9977806946852882, 0.5778527989444576, 0.5533588101522955] # 初始化sigma数组,避免引用导致的意外修改 sigma = np.array([[0.02109]] * 12) # 一一对应赋值,遍历位置和对应值 for pos, val in zip(J, V): sigma[pos] = val # 包装成预期的列表格式 result = [sigma] # 验证输出 print(result)
代码说明
- 剔除了
V中的无效空列表,调整J为实际需要修改的位置,确保两者一一对应。 - 直接初始化独立的
sigma数组,避免原代码中列表引用带来的意外修改。 - 使用
zip函数将位置和值配对遍历,逻辑清晰高效,避免嵌套循环的冗余操作。
内容的提问来源于stack exchange,提问作者user19862793
相关产品推荐
相关产品推荐

