【发布时间】:2019-09-11 20:21:17
【问题描述】:
试图与时俱进并学习 Python 的老派 c 程序员。努力了解如何有效地使用矢量化来替换 for 循环。我得到了 Python 可以在单个语句中对整个矩阵执行数学函数的基本概念,这真的很酷。但我很少处理数学关系。几乎我所有的 for 循环都应用了条件逻辑。
这里有一个非常简单的例子来说明这个概念:
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 循环,该语句只用不是 np.nan 的 override 的值覆盖 default 的值。但我不知道该怎么做。
这只是一个简单的例子来说明这个概念。 我真正的问题是向量化是否通常有助于用条件逻辑替换 for 循环,或者它是否仅适用于数学关系,实现它们的好处和方法是显而易见的。 我所有真实的代码挑战要复杂得多,条件逻辑也比简单的“仅在非 nan 时才使用此值”更复杂。
我在网上找到了数百篇关于如何在 Python 中使用向量化的文章,但它们似乎都专注于在 for 循环中替换 数学计算。我所有的 for 循环都涉及条件逻辑。矢量化可以帮助我还是我想在圆孔中安装一个方形钉?
谢谢!
【问题讨论】:
-
我认为@EliadL 的回答很好,它说明了为什么“这取决于”你是否应该矢量化。您通常会从矢量化中获得性能提升——即您的代码将运行得更快。但是,对于可读性,有一些话要说。对我来说,代码中的原始
for循环更具可读性和可理解性。 OTOH,您养成了每天使用 numpy 的习惯,那么np.where看起来完全正常,您会受益于速度和可读性。