scipy.curve_fit报错N=5不得超过M=2,M为何识别为2而非67
错误原因
scipy.optimize.curve_fit 默认将 ydata 的第一个维度长度判定为样本数M。你当前的ydata形状为(2, 67),第一个维度长度为2,因此触发了“待拟合参数数量5不能超过样本数2”的校验报错。
你设计的二维坐标输出的拟合逻辑没有问题,只是不符合curve_fit对输入形状的默认约定,调整输入形状即可正常运行。
两种可行解决方案
- 方案一:调整维度适配新版scipy的多输出支持
新版scipy的curve_fit已经支持多输出拟合,要求样本数为数组的最后一个维度,你只需要将ydata和elfunxy的输出调整为(样本数, 输出维度)的形状即可:# 调整ydata为(67, 2)形状,样本数为第一维度长度67 ydata = xyrp[:, :2] # 调整elfunxy返回值形状,向量输入时返回(67,2),标量输入时返回(2,) def adjusted_elfunxy(phi, *params): return elfunxy(phi, *params).T popt, pcov = optimize.curve_fit(adjusted_elfunxy, xdata, ydata, p0=[centy,centx,mean*2,mean/2,0.3]) - 方案二:展平输出兼容所有版本scipy
不需要调整原有函数实现,直接将二维坐标展平为一维序列,总样本数变为134,完全满足5个参数的拟合要求:# 把ydata展平为一维,形状为(134,) ydata_flat = ydata.flatten() # 包装elfunxy,输出也对应展平 def flat_elfunxy(phi, *params): return elfunxy(phi, *params).flatten() popt, pcov = optimize.curve_fit(flat_elfunxy, xdata, ydata_flat, p0=[centy,centx,mean*2,mean/2,0.3])
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

