使用scipy.integrate.quadrature触发TypeError错误如何解决
报错根因
scipy.integrate.quad调用被积函数时传入的是单个浮点标量,你的插值求值逻辑返回单值时类型匹配,因此无报错scipy.integrate.quadrature会批量传入一维浮点数组作为入参x,你当前的Integrand实现仅适配标量输入,ndInterp.eval处理批量点时返回的结果为object类型数组/维度不匹配,无法安全转换为float64,触发类型错误
解决方案
方案1:修改被积函数适配数组输入(性能最优)
调整Integrand的逻辑,支持批量处理x数组,同时强制转换返回值为float64类型:
import numpy as np import scipy.integrate def Integrand(x, a, i): # 统一x为数组类型 x = np.asarray(x) # 批量构造(N, 2)格式的插值点,N为x的元素个数 pnt = np.column_stack([np.full(x.shape, a), x]) # 强制将求值结果转为float64,并拉平为与x维度匹配的一维数组 return np.asarray(thing[i].eval(pnt), dtype=np.float64).ravel() logpost = scipy.integrate.quadrature(lambda x: Integrand(x, a, i), lower_m, upper_m)[0]
方案2:用np.vectorize包装被积函数(改造成本最低)
如果不想修改原有Integrand实现,可直接用numpy的向量化包装器强制逐元素处理输入,适合小数据量积分场景:
vec_integrand = np.vectorize(lambda x: Integrand(x, a, i)) logpost = scipy.integrate.quadrature(vec_integrand, lower_m, upper_m)[0]
方案3:继续使用scipy.integrate.quad
如果对积分性能要求不高,quad本身的鲁棒性更强,适配标量输入的被积函数,大部分通用场景下精度完全满足需求。
内容的提问来源于stack exchange,提问作者havij farangi
相关产品推荐
相关产品推荐

