首页 > 解决方案 > 在 Python 中向量化条件逻辑?

问题描述

老派 c 程序员试图与时俱进并学习 Python。努力了解如何有效地使用矢量化来替换 for 循环。我得到了 Python 可以在单个语句中对整个矩阵执行数学函数的基本概念,这真的很酷。但我很少处理数学关系。几乎我所有的 for 循环都应用 CONDITIONAL 逻辑。

这是一个非常简单的例子来说明这个概念:

import numpy as np

# Initial values
default = [1,2,3,4,5,6,7,8]
# Override values should only replace initial values when not nan
override = [np.nan,np.nan,3.5,np.nan,5.6,6.7,np.nan,8.95] 

# I wish I knew how to replace this for loop with a single line of vectorized code
for i in range(len(default)):
    if(np.isnan(override[i])==False): #Only override when override value is other than nan
        default[i]=override[i]

default

我有一种感觉,可以使用单个 python 语句消除 for 循环,该语句仅用不覆盖的default值覆盖overridenp.nan。但我看不出该怎么做。

这只是一个简化的例子来说明这个概念。我真正的问题是向量化是否通常有助于用条件逻辑替换 for 循环,或者它是否仅适用于数学关系,其中实现它们的好处和方法是显而易见的。我所有真正的代码挑战都复杂得多,条件逻辑也比简单的“仅在非 nan 时才使用此值”更复杂。

我在网上找到了数百篇关于如何在 Python 中使用向量化的文章,但它们似乎都专注于替换for 循环中的数学计算。我所有的 for 循环都涉及条件逻辑。矢量化可以帮助我还是我试图在圆孔中安装一个方形钉?

谢谢!

标签: pythonnumpy

解决方案


首先是矢量化版本:

override_is_not_nan = np.logical_not(np.isnan(override))
np.where(override_is_not_nan, override, default)

至于你真正的问题,矢量化对于多处理很有用。
不仅适用于多核 CPU。
考虑到今天的 GPU 有数千个内核,使用具有类似代码的张量可以使其运行速度更快。快多少
这取决于您的数据、实施和硬件。
显然,向量化与 GPU 的结合是深度学习领域取得巨大进步的部分原因。


推荐阅读