Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用scipy进行曲线拟合-我遇到类型错误_Python_Numpy_Scipy - Fatal编程技术网

Python 使用scipy进行曲线拟合-我遇到类型错误

Python 使用scipy进行曲线拟合-我遇到类型错误,python,numpy,scipy,Python,Numpy,Scipy,我从一个文件中读取一些x和y数据,将其转换为浮点并放入单独的数组中,然后从scipy调用一个曲线拟合函数 它根据我使用的公式(在定义的函数中)给出不同的错误消息。我已经在我想要使用的等式之后对代码进行了注释,它是顶部未注释的等式(第9行) 我可以理解为什么它可能需要一个浮点数而不是一个字符串,但我在类型转换方面的尝试似乎并不奏效。我最常见的错误是TypeError:需要浮点数 如果我试图传递它的值,而不是从我的文件中读取,而是使用np.linspace,就像我在scipy网站上找到的一个示例一样

我从一个文件中读取一些x和y数据,将其转换为浮点并放入单独的数组中,然后从
scipy
调用一个曲线拟合函数

它根据我使用的公式(在定义的函数中)给出不同的错误消息。我已经在我想要使用的等式之后对代码进行了注释,它是顶部未注释的等式(第9行)

我可以理解为什么它可能需要一个浮点数而不是一个字符串,但我在类型转换方面的尝试似乎并不奏效。我最常见的错误是
TypeError:需要浮点数

如果我试图传递它的值,而不是从我的文件中读取,而是使用
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

你的
x
是一个列表,你在上面调用
math.pow
math.pow
只知道如何提升浮动或可转换为浮动的事物。因此,
TypeError:float是必需的
。这就是我们拥有
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]])

你的
x
是一个列表,你在上面调用
math.pow
math.pow
只知道如何提升浮动或可转换为浮动的事物。因此,
TypeError:float是必需的
。这就是我们拥有
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]])

谢谢,是的,你的例子很有效。我实际上不需要x值,这似乎会混淆它,因此使用x=linspace(1,len(y),len(y))。它的行为正如我现在所预料的那样。它确实给出了一些警告:RuntimeWarning:exp中遇到溢出,RuntimeWarning:multiply中遇到溢出-忽略这些是否安全?非常感谢您的帮助。这是一个单独的问题,但忽略可能不安全。记住,你只能取小于大约700的浮点数的指数。谢谢你,是的,你的例子是有效的。我实际上不需要x值,这似乎会混淆它,因此使用x=linspace(1,len(y),len(y))。它的行为正如我现在所预料的那样。它确实给出了一些警告:RuntimeWarning:exp中遇到溢出,RuntimeWarning:multiply中遇到溢出-忽略这些是否安全?非常感谢您的帮助。这是一个单独的问题,但忽略可能不安全。请记住,您只能获取小于大约700的浮点数的指数。