【问题标题】:method to circumvent if-else checking绕过if-else检查的方法
【发布时间】:2016-05-18 15:08:15
【问题描述】:

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

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) 值?

【问题讨论】:

  • 什么是wavelength?标量、列表、数组还是其他? do somethingwavelength 做了什么吗?
  • 波长是一个数字。最直接的方法是将它们作为标量。是否将它们存储在其他结构中可能有助于避免使用我所要求的这些 if else 语句。那些做某事是指链接中显示的计算,即为给定波长找到三个数字(r,g,b)。

标签: if-statement numpy optimization conditional vectorization


【解决方案1】:

是的,有。如果你的波长在一个 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 并不是要为您编写代码。我认为通过这个例子你应该能够实现这些公式。

【讨论】:

    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多