Я работаю над классом для работы с наборами данных "x, y". Данные обычно поступают из текстовых файлов, где первый столбец данных хранится в «x», а второй столбец хранится в «y».
Я добавляю некоторую функциональность «подгонка кривой» к классу. И я получаю ошибку в заголовке этого поста.
Вот класс:
class XY(object):
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np
def __init__(self,f=None):
self.file(f)
self.read()
return
def file(self,f=None):
self.filename=self.get_filename(f)
return
def filename(self):
return self.filename
def get_filename(self,f):
if(type(f)==str):
filename=f
elif(type(f)==file):
filename=f.name
else:
filename=None
return filename
def read(self,f=None):
if(f is None):
if(self.filename is None):
return
else: # Use internal filename
filename=self.filename
else: # Change/set internal filename
self.filename=self.get_filename(f)
filename=self.filename
data=[]
try:
with open(filename,'r') as F:
for line in F:
data.append(line.split())
except IOError as e:
print("%s"%e)
return
F.close()
for r in range(0,len(data)):
for c in range(0,len(data[r])):
data[r][c]=float(data[r][c])
self.data=data
self.x=[self.data[i][0] for i in range(0,len(self.data))]
self.y=[self.data[i][1] for i in range(0,len(self.data))]
return self.data
def f00(self,x,a,b,c,d):
return a*x**b*self.np.exp(-c*x)+d
def cf00(self):
popt,pcov=self.curve_fit(self.f00,self.x,self.y)
self.y=self.f00(self.x,*popt)
return self.y
Я вставляю класс в python в интерактивном режиме. А затем попробуйте следующее:
$ python
Python 2.7.14 (default, Oct 31 2017, 21:12:13)
[GCC 6.4.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
Я вставляю в класс, показанный выше, а затем попробуйте следующее:
>>> xy=XY("rot-03-05.dat")
>>> len(xy.x)
220
>>> len(xy.y)
220
>>> xy.cf00()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 56, in cf00
File "/usr/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 751, in curve_fit
res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
File "/usr/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 383, in leastsq
shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
File "/usr/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 27, in _check_func
res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
File "/usr/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 463, in func_wrapped
return func(xdata, *params) - ydata
TypeError: 'XY' object is not callable
>>> xy.cf00
<bound method XY.cf00 of <__main__.XY object at 0x6ff5ea25fd0>>
Я пытался взять self
из f00()
и cf00()
. Не сработало.
Я попытался позвонить f00()
из моего экземпляра, и это работает:
>>> xy=XY()
>>> xy.f00(1,1,1,1,1)
1.3678794411714423
Я использовал эту функцию подгонки кривой в другом месте, и она работает. Сейчас я пытаюсь реализовать его в классе.
Вот отдельные функции, которые работают, когда они не являются частью класса:
def f00(x,a,b,c,d): return a*x**b*np.exp(-c*x)+d
def cf00(x,y):
popt,pcov=curve_fit(f00,x,y,maxfev=1200000)
return f00(x,*popt)
y1=cf00(x,y)
Нет проблем.