Python numpy绘图触发ValueError数组形状不匹配报错求助
NumPy循环赋值形状不匹配报错解决
报错核心原因
触发ValueError: could not broadcast input array from shape (99,) into shape (100,)的根源有两个:
- 你调用的
It.cumtrapz(累积梯形积分函数)默认输出长度比输入数组少1:n个采样点的梯形积分是基于n-1个相邻区间计算的,传入长度100的数组时,默认返回长度99的积分结果,自然无法赋值给长度100的solA[:, i]列。 - 你传入cumtrapz的数组索引写错了:循环里
sol[:, i]才是第i组参数下求解得到的完整时序结果,你写的sol[i:, 1]是固定取sol第2列(索引为1)从第i行开始的切片,既不是当前循环的计算结果,切片长度还会随i增大不断变短,哪怕解决了长度问题结果逻辑也是错的。
你注释掉solA赋值语句后打印两个数组形状都是(100,100),是因为此时solA始终是初始化生成的全零数组,根本没进入赋值逻辑,这个验证结果不能说明赋值语句本身的形状匹配性。
修复方案
直接修改循环内的solA赋值逻辑即可:
- 把待积分的输入修正为当前循环算出的时序解
sol[:, i] - 给cumtrapz传入
initial=0参数,让函数在积分结果头部补初始值0,输出长度和输入数组保持一致,刚好匹配solA的列长度
修复后的完整循环代码如下:
sol = np.zeros((partition, partition)) solA = np.zeros((partition, partition)) for i in range(partition): sol[:, i] = odeint(SolveMe, ic, timeSpace, args=(zeemanSpace[i],))[:, 1] # 修正索引+对齐积分结果长度 solA[:, i] = (1/time[-1]) * It.cumtrapz(sol[:, i], timeSpace, initial=0)
内容的提问来源于stack exchange,提问作者Taylor Larrechea
相关产品推荐
相关产品推荐

