lmfit传入scipy CubicSpline生成数组报错问题排查
问题解决:TypeError: unsupported operand type(s) for *: 'CubicSpline' and 'float'
问题根源
你混淆了scipy.interpolate.CubicSpline的对象本身和它的计算结果:
scpi.CubicSpline(A, B)返回的是样条插值函数对象,不是浮点数组- 只有调用该对象(比如
cs(A))才会得到插值后的浮点数组 - 错误核心是你在
minimize的args中可能误传了CubicSpline对象,而非其计算后的数组(尽管你提供的代码里写了x_list(A),但实际运行时大概率存在变量名混淆或笔误)
修正后的代码
import scipy.interpolate as scpi import numpy as np from lmfit import Parameters, minimize A = np.linspace(0,1,100) B = A**2 y_list = np.linspace(1,100,100) # 明确命名:cs是样条函数对象 cs = scpi.CubicSpline(A, B) # 生成插值后的浮点数组 x_arr = cs(A) def model(pars, x, data=None): model = x * pars['a'] if data is None: return model return model - data fit_params = Parameters() fit_params.add('a', value=1., min=0.0, vary=True) # args传入插值后的数组x_arr,而非样条对象cs coeff = minimize(model, fit_params, args=(x_arr,), kws={'data': y_list}, method='basinhopping', )
关键修正点
- 分离样条对象和插值结果:用不同变量名区分(比如
cs存对象,x_arr存数组),彻底避免混淆 - 确保
minimize的args参数传入的是浮点数组(x_arr),而非CubicSpline对象 - 移除无效的强制类型转换:直接使用样条对象的调用结果即可得到数组,无需额外转换
内容的提问来源于stack exchange,提问作者Elijah
相关产品推荐
相关产品推荐

