2013-12-08 53 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