规避if-else检查的方法

时间:2016-02-08 20:09:03

标签: if-statement numpy optimization conditional vectorization

我只是想知道我是否想要使用本文中的算法(p5-6)实现将波长转换为(r,g,b)的程序:http://www.scientificbulletin.upb.ro/rev_docs_arhiva/full49129.pdf,而不是检查波长的值使用if-else喜欢

if wavelength>380 and wavelength<410:
    # do something
elif wavelength<440:
    # do something
elif wavelength<490:
    # do something, and so on

是否有一些天才方法可以避免使用if-else语句以便我可以加速代码?更具体地说,假设我将波长存储在列表或numpy数组中,是否可以进行某种“矢量化”。生成(r,g,b)值的方法?

1 个答案:

答案 0 :(得分:0)

是的,有。如果您的波长是numpy数组,则可以使用boolean masks代替if ... elif ...子句。

关于矢量化操作的第二个问题......我想你想要这样的事情:

wavelengths = np.array([1,2,3])
conversion = np.array([-0.41,0,0.6]).reshape(3,1) # R, G, B Parts
wavelengths * conversion
# Reshape is needed to get a 3x3 result
array([[-0.41, -0.82, -1.23],
       [ 0.  ,  0.  ,  0.  ],
       [ 0.6 ,  1.2 ,  1.8 ]])

给定的公式比这个例子复杂一点,但StackOverflow并不是要写代码。我想通过这个例子你应该能够实现这些公式。