我從文件讀取一些x和y數據,轉換爲浮點數並放入單獨的數組,然後調用scipy
的曲線擬合函數。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);
OR我嘗試這從他們給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值,這似乎混淆了它,所以使用x = linspace(1,len(y),len(y))。它的行爲如我現在所期望的那樣。 它提供了一些警告:RuntimeWarning:在exp中遇到溢出,RuntimeWarning:在multiply中遇到溢出 - 是否可以忽略這些? 非常感謝您的幫助x – James
這是一個單獨的問題,但忽略它可能並不安全。請記住,你只能使用小於大約700的浮點數的指數。 – DSM