Python / curve_fit:无法通过初始猜测传递数组

时间:2019-03-03 23:44:28

标签: arrays python-3.x parameter-passing

我具有此功能来计算某种多项式:

def pipoly(df,pj):
    n=np.size(pj)
    p=pj[0]
    for j in range(1,n):
        p+=pj[j]*df**j
    return p

pj应该是一个包含多项式系数的初始猜测的数组;因此,多项式的阶数由第一行中的函数本身确定。 df是一个标量变量。此函数以

的形式传递给scipy.optimize的curve_fit
parfit,covfig=curve_fit(pipoly,[f-f0[j] for f in f_df[if0[j]:if0[i]]],
                            pmode_xp[ph][if0[j]:if0[i]],
                            p0=([pmode0[ph][-1],(pmode_xp[ph][if0[i]]-pmode_xp[ph][if0[j]])/df]))

函数名称后的前两个参数是数组(2D数组的1D切片),并且我已经确认它们具有相同的长度。 pipoly之后的第三个参数应该是具有pj的初始猜测的元组,我在之前将其打印出来:[0.4586590267346888, 0.7419930843896957]。那么,为什么Python抱怨TypeError: pipoly() takes 2 positional arguments but 3 were given?而且,如果我删除了p0参数,就会被告知pj被认为是标量,因此不能有索引。我如何清楚地暗示pj是一个数组?

1 个答案:

答案 0 :(得分:0)

您的声明:

  

pj应该是包含以下元素的系数的数组   多项式;

是错误的。根据{{​​3}}:

  

scipy.optimize.curve_fit(f,xdata,ydata,p0 = None,sigma = None,absolute_sigma = False,check_finite = True,bounds =(-inf,inf),method = None,jac = None,** kwargs)[源代码]使用非线性最小二乘法将函数f拟合到数据。

     

假设 ydata = f(xdata,* params)+ eps

这意味着pipoly()使用的curve_fit()函数必须使用等于您多项式的参数数量加一个(变量,这是第一个参数)的参数数量。
错误:

  

TypeError:pipoly()接受2个位置参数,但给出了3个?

告诉您pipoly收到3个参数,因为您可能正在测试线性策略,因此这三个参数分别是自变量和两个参数([f-f0[j] for f in f_df[if0[j]:if0[i]]]东西是2长度列表) 。
在编写时,它只接受2个参数。

您可以在pj之前添加星号来轻松解决问题:

def pipoly(df,*pj):
    n=len(pj) #len() is sufficient here, but np.size() works too.
    p=pj[0]
    for j in range(1,n):
        p+=pj[j]*df**j
    return p

这样,您的函数可以接受可变数量的参数。 curve_fit() docs进一步说明python函数参数中星号的含义和用法。