np.select()、np.piecewise()对多条件逻辑判断的向量化计算的支持

当python程序里出现大量的条件判断时,要如何做到让程序运行的速度最快?
这是一直以来都遇到的问题,python的for if else结构速度很慢,特别是[for 里 if 嵌套if] 、[for if 并列 elif]的方法,
暂时写的算法里用的是:
1、np.where()、df.where、df.map替代一部分条件逻辑
2、把条件逻辑判断写到def()里,再apply或者是list(map())调用条件逻辑的def()
这两种方法都要比[for if 套 if]快很多,几乎在任何数据场景下。但是有没有更好的方法?
今天看到两个可能有优化效果的函数,记录一下。

来源:https://www.cnblogs.com/fengguozhuying/p/9171806.html

np.selcect() 
np.select(condlist, choicelist, default=0)

condlist是首选条件,choicelist是候选的条件.(如果condlist满足那么choicelist就没用),default是两者都满足后还剩余的默认值.

例1:
t = np.arange(6)
t
Out[12]: array([0, 1, 2, 3, 4, 5])

np.select([t<6,t>2,True],[t+10,t-10,66])   #因为t<6都满足,索引执行t+10,t>2和默认值都不执行
Out[11]: array([10, 11, 12, 13, 14, 15])

np.select([t>3,t<1,True],[t+10,t+20,66])      #t>3时执行t+10,t<1时执行t+20,剩余的执行66
Out[14]: array([20, 66, 66, 66, 14, 15])

列2:
x = np.arange(10)
>>> condlist = [x<3, x>5]
>>> choicelist = [x, x**2]
>>> np.select(condlist, choicelist)
array([ 0, 1, 2, 0, 0, 0, 36, 49, 64, 81])

x<3执行条件的结果是0, 1, 2;
x>5执行结果是6,7,8,9,那么进入条件x**2,最后结果为36, 49, 64, 81;
中间的3,45没有条件执行到,则为默认返回条件0,0,0

np.select(condlist, choicelist,default='no')
Out[47]: array(['0', '1', '2', 'no', 'no', 'no', '36', '49', '64', '81'],
      dtype=')
3
来源:https://blog.csdn.net/pipisorry/article/details/51822775

def triangle_wave(x, c, c0, hc):
      x = x - x.astype(np.int) #三角波的周期为1,因此只取x坐标的小数部分进行计算 
      return np.where(x>=c,0,np.where(xdef triangle._wave2(x, c, c0, hc):
      x = x - x.astype(np.int)
      return np.select([x>=c, xTrue], [0, x/c0*hc, (c-x)/(c-c0)*hc])

也可以使用default:return np.select([x>=c, x0, x/c0*hc], default=(c-x)/(c-c0)*hc) 

使用piecewise()计算三角波形

def triangle_wave3(x, c, c0, hc):
       x = x - x.astype(np.int) 
       return np.piecewise(x,
                           [x>=c, x0, # x>=c
                           lambda x: x/c0*hc, # x
                           lambda x: (c-x)/(c-c0)*hc]) # else

使用piecewise()的好处在于它只计算需要计算的值.因此在上面的例子中,表达式 “x/c0*hc”和“(c-x)/(c-c0)*hc”只对输入数组x中满足条件的部分进行计算。

调用
x = np.linspace(0, 2, 1000)
y4= triangle_wave3(x,0.6, 0.4, 1.0)

例4:
np.select()、np.piecewise()对多条件逻辑判断的向量化计算的支持_第1张图片

x = np.linspace(3, 9, 100)
cond = [x < 3, (3 <= x) & (x <= 9), x > 9];
func = [0, lambda x : (x - 3) / (9 - 3), 1];
np.piecewise(x, cond, func)

你可能感兴趣的:(向量化编程)