2013-12-08 72 views
0

如何在函數中寫入條件(k_over_iq)?python,如何在函數中寫條件?

dt_for_all_days_np=a numpy array of numbers. 


def k_over_iq(dt): 
    if dt !=0: 
     return 0.7*(1-e**(-0.01*dt**2.4)) 
    else: 
     return 1 

k_over_iq_i=k_over_iq(dt_for_all_days_np) 

我得到以下錯誤:

如果DT = 0:!ValueError異常:具有多於一個元素的數組的真值是不明確的。使用a.any()或a.all()

+5

您是否缺少函數中某個級別的縮進? –

+1

預期結果是什麼?觀察結果是什麼?爲什麼這兩個不一樣? – inspectorG4dget

回答

0

縮進是函數中的問題。
我建議你閱讀本:如果dtnumpy陣列Python: Myths about Indentation

def k_over_iq(dt): 
    if dt !=0: 
     return 0.7*(1-e**(-0.01*dt**2.4)) 
    else: 
     return 1 

k_over_iq_i=k_over_iq(dt_for_all_days_np) 
1

if dt != 0:將無法​​正常工作。 if嘗試從數組中獲取單個布爾值,並且如錯誤消息警告的那樣,這是不明確的:array([True, False]) True或False?

要以矢量化方式解決這個問題,兩種常用的方法是使用where或使用布爾索引來打補丁。

方法#1,np.where

>>> dt = np.array([0,1,2,3]) 
>>> np.where(dt != 0, 0.7*(1-np.exp(-0.01*dt**2.4)), 1) 
array([ 1.  , 0.00696512, 0.03598813, 0.09124601]) 

此使用函數每當dt != 0

>>> dt != 0 
array([False, True, True, True], dtype=bool) 

,否則爲1。

方法2:布爾索引修補

計算功能無處不在,然後修復是錯誤的值。

>>> b = 0.7*(1-np.exp(-0.01*dt**2.4)) 
>>> b 
array([ 0.  , 0.00696512, 0.03598813, 0.09124601]) 
>>> b[dt == 0] = 1 
>>> b 
array([ 1.  , 0.00696512, 0.03598813, 0.09124601]) 
+0

我看到問題了。有沒有將它添加到定義的函數中? – icypy

+0

我不確定你的意思。如果需要,沒有理由不能在'k_over_iq'中執行上述操作。 – DSM

+0

明白了,謝謝! – icypy