2011-11-17 77 views
2

我想使用Numpy來適合具有絕對值的分段函數。適合使用Python的分段函數

數學函數是

X < P [1]:Y = 1個+ P [0] * ABS((大小+ X - P [1])/尺寸 - 尺寸/ 2)

X> = p [1]:Y = 1個+ p [0] * ABS((X - p [1])/尺寸 - 尺寸/ 2)

這是我的Python函數:

fitfunc = lambda p, x: \ 
    x < p[1] and\ 
    1 + p[0] * abs((data['n1'].size + x - p[1])/data['n1'].size - data['n1'].size/2) or\ 
    1 + p[0] * abs((x - p[1])/data['n1'].size - data['n1'].size/2) 

雖然,我得到的錯誤:

The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

但是,任何和所有評估整個列表爲單個布爾值。

更多信息:

我已經通過使用lambda表達式來數據擬合正弦波如下:

fitfunc = lambda p, x: 1 + p[0] * sin(pi * x/data['n1'].size + p[1]) 
errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function 

然後在一個循環:

data = np.genfromtxt(dataFileName, names=('n1', 'n2')) 
xAxisSeries = scipy.linspace(0., data['n1'].max(), data['n1'].size) 

p0 = [489., 123.] # Initial guess for the parameters 
p1, success = scipy.optimize.leastsq(errfunc, p0[:], args=(xAxisSeries, data['n2'])) 

#time says which points from the sine wave will be plotted 
time = scipy.linspace(0., data['n1'].max(), 100) 
pylab.plot(time, fitfunc(p1, time), 'r-') 

我試圖使用lambda函數,因爲optimize.leastsq需要一個。我正在使用完全相同的代碼,除了正在更改的fitfunc。

+0

你什麼時候遇到這個錯誤?你如何調用這個功能?你傳遞給它什麼? – Tadeck

+1

這裏有一個誤解。用def構造的函數對於其他函數來說是非常好的輸入。在Python中使用lambda的原因是創建匿名函數,但考慮到您命名它們,沒有必要避免def。 – dyoo

回答

2

上面的代碼看起來不像地道,讓生活比應該更難。 :)

如果你試圖定義一個函數,並給它在同一時間一個名字,傳統的方法是使用高清,不拉姆達

fitfunc = lambda p, x: ... ## you're making a named function, so just do... 

def fitfunc(p, x): ... 

一旦你有,你沒有來模擬「和」和「或」短路分支:你可以,如果使用。嘗試模擬if時遇到問題。

0

真正地說,目前還不清楚你正在試圖用你的lambda函數做什麼。 但也許這是一天在我這邊的時間...

在任何情況下,請注意,任何(somelist)和np.array()。any()是相同的,但可以被稱爲不同的。

In [2]: a=np.ones(4) 

In [3]: a 
Out[3]: array([ 1., 1., 1., 1.]) 
In [4]: a.any() 
Out[4]: True 

In [8]: a[1]=0 

In [9]: a.all() 
Out[9]: False 

In [11]: somelist=["1","1","a","3"] 

In [12]: any(somelist) 
Out[12]: True 

請注意還有評論,你怎麼稱呼這個功能?你可以請張貼更多的代碼嗎?

0

使用def和scipy.optimize.curve_fit()。

import scipy.optimize as so 

def fitfunc(p, x): 
    '''Define fit function''' 
    if x < p[1]: 
     return 1 + p[0] * abs((data['n1'].size + x - p[1])/data['n1'].size - data['n1'].size/2) 
    else: 
     return 1 + p[0] * abs((x - p[1])/data['n1'].size - data['n1'].size/2) 

popt, pcov = so.curve_fit(fitfunc, x, y) 
+0

我現在已經創建了一個看起來像這樣的函數。但是,popt返回爲[1.],pcov返回爲inf。我看到有一個爲curve_fit一個P0猜測參數,而是試圖把我自己的猜測參數,使該錯誤: 類型錯誤:fitfunc()到底需要2個參數(3給出) 我叫它爲: P1 ,success = optimize.curve_fit(fitfunc,xAxisSeries,data ['n2'],p0 = p0) – user1005909