我从文件中读取一些x和y数据,转换为float并放入单独的数组,然后从scipy
调用曲线拟合函数。
它根据我使用的等式(在定义的函数中)给出了不同的错误消息。我在我想要使用的等式之后对代码进行了评论,它是顶部的,未注释的等式(第9行)。
我可以理解为什么它可能需要浮点数而不是字符串,但我对类型转换的尝试似乎没有用。我最常见的错误是TypeError: a float is required
如果我尝试传递的值不是从我的文件中读取,而是使用np.linspace
,就像我在scipy网站上找到的示例一样,它会给我一个不同的错误。
我已对代码中的错误进行了评论,希望您能明白这一点。我还粘贴了我正在使用的输入文本文件。
import sys
import numpy as np
import math as m
from scipy.optimize import curve_fit
def func( x, a, b ):
return a*m.pow( x, 2 )*np.exp( -b*x ); #the function I want!: line 9 in funcTypeError: a float is required
#return a*m.exp(-b*x) #line 10 in func TypeError: a float is required
#return a*np.exp(-b*x) #Example equation. line 444 in _general_function
#ValueError:operands could not be broadcast together with shapes
#return a*b*m.pow( x, 2 ); #line 10 in func TypeError: a float is required
#end def
file = sys.argv[1];
f = open( file );
y_array = [];
x_array = [];
for line in f:
words = line.split();
x = words[0].rstrip('\r\n');
y = words[1].rstrip('\r\n');
x_array.append( float( x ) );
y_array.append( float( y ) );
#end for
#data = f.read();
popt, pcov = curve_fit( func, x_array, y_array );
或者我从他们在scipy网站上给出的例子中尝试这个,用我上面的,未注释的,期望的等式
x = np.linspace(0,4,50)
y = func(x, 2.5, 1.3 )
yn = y + 0.2*np.random.normal(size=len(x))
popt, pcov = curve_fit(func, x, yn)
#TypeError: only length-1 arrays can be converted to Python scalars.
输入文件(只需几行,还有更多)。两列数字
352 28
423 30
494 32
565 3
636 0
707 0
答案 0 :(得分:4)
您的x
是一个列表,而您正在呼叫math.pow
。 math.pow
只知道如何提升浮动或可转换成浮点数的东西。因此,TypeError: a float is required
。这是我们numpy
的原因之一。 :^)
我们可以通过与numpy
一起使用来简化这一过程。然后我们可以简单地使用**
来获取整个数组的强大功能。
def func( x, a, b ):
return a * x**2 * np.exp( -b*x )
file = sys.argv[1]
x,y = np.loadtxt(file, unpack=True)
popt, pcov = curve_fit( func, x, y)
给了我
>>> popt
array([ 1., 1.])
>>> pcov
inf
使用您的数据,该功能不太适合该功能。该示例效果更好:
>>> x = np.linspace(0,4,50)
>>> y = func(x, 2.5, 1.3 )
>>> yn = y + 0.2*np.random.normal(size=len(x))
>>> popt, pcov = curve_fit(func, x, yn)
>>> popt
array([ 3.15537828, 1.43218611])
>>> pcov
array([[ 0.08045745, 0.01257863],
[ 0.01257863, 0.00232191]])