Arrays Python/curve_fit:无法使用init guess传递数组

Arrays Python/curve_fit:无法使用init guess传递数组,arrays,python-3.x,parameter-passing,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的曲线拟合as parfit,covfig=curve_fit(pipoly,[f-f0[j]

我用这个函数来计算某种多项式:

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的
曲线拟合
as

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()接受了2个位置参数,但给出了3个位置参数呢?如果我去掉
p0
参数,我会被告知
pj
被认为是标量,因此不能有索引。我如何向pipoly说明
pj
是一个数组?

您的陈述:

pj
应该是一个包含 多项式

这是错误的。根据:

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(扩展数据,*参数)+eps

这意味着
curve\u fit()
要使用的
pipoly()
函数的参数数必须等于多项式的参数数加上1(变量,即第一个参数)。
错误:

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

正在告诉您,
pipoly
接收3个参数,因为您可能正在测试一个线性polinomyal,所以这三个参数是自变量和两个参数(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

这样,函数就可以接受数量可变的参数。更多关于python函数参数中星号的含义和用法的信息。

我编辑了我的帖子,以澄清pj应该包含参数(即系数)的初始猜测。是的,在这个例子中,我尝试一个线性函数。然而,如果我像你建议的那样改变pipoly的定义,结果不是一个需要的单个数字,而是一个序列。这也是不正确的。它只是表示要估计其值的多项式的参数。您可以在
曲线拟合()
中提供初始猜测(
p0
)。是的,结果是一个包含参数估计值的序列。为什么期望结果是单个数字?
pipoly
是拟合模型,它应该为每个
df
返回单个值。换句话说,当
curve\u fit
作为拟合的结果在
parfit
中产生一组参数时,我应该能够在调用中传递这些参数,如
pipoly(0.2,parfit)
以便根据优化的参数集返回0.2的
pipoly
函数值。因为您没有解压缩参数列表。试试这个:
y=pipoly(0.2,*parfit)
(再次注意星号。阅读我答案中的链接)<代码>y是您的预期结果。