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

问题描述 投票:1回答:1

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

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 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() takes 2 positional arguments but 3 were given?如果我删除p0论证,我被告知pj被认为是标量,因此不能有索引。我如何清楚地知道pj是一个阵列?

arrays python-3.x parameter-passing
1个回答
0
投票

你的陈述:

pj应该是一个包含多项式系数的数组;

是错的。据curve_fit() docs说:

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)[ source]使用非线性最小二乘法使函数f适合数据。

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

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

TypeError:pipoly()需要2个位置参数,但是给出了3个?

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

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

© www.soinside.com 2019 - 2024. All rights reserved.