2016-09-22 106 views
0

我一直在嘗試使用scipy.optimize curve_fit使用多個變量。它正常工作與我創建的測試代碼,但是當我嘗試實現這個在我的實際數據我不斷收到以下錯誤多變量非線性curve_fit與scipy

TypeError: only arrays length -1 can be converted to python scalars

陣列的形狀和它們的元素在我的測試代碼中的數據類型和實際的代碼是完全一樣的,所以我很困惑,爲什麼我得到這個錯誤。

測試代碼:

import numpy as np 
    import scipy 
    from scipy.optimize import curve_fit 

    def func(x,a,b,c): 
      return a+b*x[0]**2+c*x[1] 
    x_0=np.array([1,2,3,4]) 
    x_1=np.array([5,6,7,8]) 
    X=scipy.array([x_0,x_1]) 
    Y=func(X,3.1,2.2,2.1) 
    popt, pcov=curve_fit(func,X,Y) 

實際代碼:

f=open("Exp_Fresnal.csv", 'rb') 
    reader=csv.reader(f) 
    for row in reader: 
     Qz.append(row[0]) 
     Ref.append(row[1]) 
     Ref_F.append(row[2]) 
    Qz_arr,Ref_Farr=scipy.array((Qz)),scipy.array((Ref_F)) 
    x=scipy.array([Qz_arr,Ref_Farr] 

    def func(x,d,sig_int,sig_cp): 
     return x[1]*(x[0]*d*(math.exp((-sig_int**2)*(x[0]**2)/2)/(1-cmath.exp(complex(0,1)*x[0]*d)*math.exp((-sig_cp**2)*(x[0]**2)/2))))**2 

    Y=scipy.array((Ref)) 
    popt, pcov=curve_fit(func,x,Y) 

編輯 以下是完整的錯誤消息

Traceback (most recent call last): File "DCM_03.py", line 46, in <module> popt, pcov=curve_fit(func,x,Y) File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 651, in curve_fit res = leastsq(func, p0, args=args, full_output=1, **kwargs) File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 377, in leastsq shape, dtype = _check_func('leastsq', 'func', func, x0, args, n) File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 26, in _check_func res = atleast_1d(thefunc(*((x0[:numinputs],) + args))) File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 453, in _general_function return function(xdata, *params) - ydata File "DCM_03.py", line 40, in func return (0.062/(2*x))**4*(x*d*(math.exp((-sig_int**2)*(x**2)/2)/(1-cmath.exp(complex(0,1)*x*d)*math.exp((-sig_cp**2)*(x**2)/2))))**2 TypeError: only length-1 arrays can be converted to Python scalars

+0

如果沒有字段'Exp_Fresnal.csv',您的代碼示例將不會運行。你能提供這個文件或一個不依賴外部文件的代碼嗎? – KeithWM

+0

我不認爲我可以將文檔文件附加到一個問題上,它基本上只是每列有155行的3列數據。此外,測試代碼不需要運行任何文檔。我包含了實際的代碼,因爲測試代碼有效,但實際的代碼卻沒有。我不確定這是否與我導入數據的方式有關? – Charco

+0

顯示完整的錯誤。應該包含更多的信息。行'''Y = func(X,3.1,2.2,2.1)'''看起來很可疑。 – sascha

回答

0

我想出了這個問題。出於某種原因,問題是在擬合函數func中使用了math.expcmath.exp。代替這些功能,我使用np.exp()。我不完全確定這是爲什麼。