调用函数的Python类问题

时间:2014-03-16 23:54:42

标签: python class curve-fitting

您好,我刚刚开始编写我的第一个python类,我对此行plsq=leastsq(lotzfit.residuals,self.p0,args=(self.y,self.x));有疑问。我可以不使用课程来运行它。但是对于课堂,我对变量感到困惑。现在我不断收到该行的错误。TypeError: unbound method residuals() must be called with lotzfit instance as first argument (got ndarray instance instead)。我试图放plsq=leastsq(lotzfit.residuals(self),self.p0,args=(self.y,self.x));但它也行不通。这是代码。顺便说一下,将这样的文件组织成一个类是正确的还是应该将它保存为一般的function.py而不是类?谢谢,

import numpy as np 
from numpy import average,max,sqrt,argmax
import numpy.random as npr
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
plt.rcParams['figure.figsize'] = 6, 9

class lotzfit:
def __init__(self,x,y,p0):
    self.x=x
    self.y=y
    self.p0=p0

def mylotz(self):
    A,B,C,D=self.p0
    # """lorentz equation."""
    return (A/((self.x-B)**2+C)) + D

def residuals(self):
#"""Deviations of data from fitted 4PL curve"""
    err = self.y-lotzfit.mylotz(self)
    return err

def peval(self):
   # """Evaluated value at x with current parameters."""
    return lotzfit.mylotz(self)

def mylotzfit(self):

    plsq=leastsq(lotzfit.residuals,self.p0,args=(self.y,self.x));

    return plsq[0]

3 个答案:

答案 0 :(得分:0)

更改

    plsq=leastsq(lotzfit.residuals,self.p0,args=(self.y,self.x));

    plsq=leastsq(self.residuals(), self.p0, args=(self.y,self.x))

答案 1 :(得分:0)

我非常确定您要使用lotzfit.residuals,而不是使用self.residuals。这将为您提供“绑定”方法,而不是“未绑定”方法。在Python 2中,一个未绑定的方法检查以确保它的第一个参数是它所定义的类的实例(在Python 3中,这个检查被删除而你只是获得了裸函数)。

这可能不足以使代码工作。看起来传递给the leastsq function的函数需要接受一个数组的参数,而residuals方法不会接受除self以外的任何参数。

还有一些其他地方可以对我上面的第一点进行类似的更改。例如,lotzfit.mylotz(self)相当于self.mylotz()(而后者更为惯用)。

答案 2 :(得分:0)

调用方法时出现轻微错误:

err = self.y-lotzfit.mylotz(self)

return lotzfit.mylotz(self)

plsq=leastsq(lotzfit.residuals,self.p0,args=(self.y,self.x));

在所有这些中,您在class对象上调用方法而不是该类的实例。他们应该是:

err = self.y-self.mylotz()

return self.mylotz()

plsq=leastsq(self.residuals, self.p0, args=(self.y,self.x)) # semi-colon not required!

实例方法会自动传递给方法,因此您无需亲自手动执行此操作。

您似乎也希望将residuals的结果传递给leastsq而不是方法本身。您可以在将该方法作为参数传递时调用该方法:

plsq=leastsq(self.residuals(), self.p0, args=(self.y,self.x))

或者您可以将其设为属性,因此属性查找返回结果:

@property
def residuals(self):
    ....

我更倾向于使用属性方法,该方法不接受参数并表示实例的值。

将类名称大写也是一种很好的做法,如果你使用的是Python 2.x,你可能想要使用一个新的类:

class Lotzfitz(object):