Python幂律拟合维度不匹配问题咨询及代码疑问
问题1:误差维度不匹配的解决方法
CRDB返回的err_sta是二维数组,每一行对应数据点的上下非对称误差(格式为[下误差, 上误差]),而LeastSquares需要一维的对称误差数组,解决方式如下:
- 取上下误差的平均值,转换为一维数组:
import numpy as np err = np.mean(t_combined.err_sta, axis=1) # 按行求平均,维度从(1236,2)变为(1236,) - 若只需要单侧误差(比如仅用上误差或下误差),直接切片提取:
err = t_combined.err_sta[:, 1] # 提取上误差 # 或 err = t_combined.err_sta[:, 0] # 提取下误差
处理后err就和x、y维度匹配,可以正常传入LeastSquares。
问题2:
plt.plot(x, (x, *m.values), label="fit")的作用(及错误) 这行代码写法错误,无法正常生成拟合曲线:
- 原本的意图应该是用拟合得到的参数
m.values(即a和gamma)代入幂律模型,计算每个x对应的拟合y值,然后绘制拟合线。 - 但当前代码里的
(x, *m.values)是把x数组、a、gamma打包成了一个三元组,plt.plot无法识别这种格式作为y轴数据,运行时会抛出类型错误。 - 正确的写法应该调用你的
power_law函数计算拟合y值:plt.plot(x, power_law(x, *m.values), label="fit")
不过你代码后面已经用更平滑的x_fit绘制了拟合线(红色虚线),这行错误的代码可以直接删除,避免冲突。
另外,代码里还有一处变量名不统一的问题:你用m = Minuit(...)拟合,但后面又写minuit.values.a,应该改成m.values.a和m.values.gamma。
内容的提问来源于stack exchange,提问作者Katie Smith
相关产品推荐
相关产品推荐

