python - 在 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
值覆盖override
np.nan
。但我看不出该怎么做。
这只是一个简化的例子来说明这个概念。我真正的问题是向量化是否通常有助于用条件逻辑替换 for 循环,或者它是否仅适用于数学关系,其中实现它们的好处和方法是显而易见的。我所有真正的代码挑战都复杂得多,条件逻辑也比简单的“仅在非 nan 时才使用此值”更复杂。
我在网上找到了数百篇关于如何在 Python 中使用向量化的文章,但它们似乎都专注于替换for 循环中的数学计算。我所有的 for 循环都涉及条件逻辑。矢量化可以帮助我还是我试图在圆孔中安装一个方形钉?
谢谢!
解决方案
首先是矢量化版本:
override_is_not_nan = np.logical_not(np.isnan(override))
np.where(override_is_not_nan, override, default)
至于你真正的问题,矢量化对于多处理很有用。
不仅适用于多核 CPU。
考虑到今天的 GPU 有数千个内核,使用具有类似代码的张量可以使其运行速度更快。快多少
?这取决于您的数据、实施和硬件。
显然,向量化与 GPU 的结合是深度学习领域取得巨大进步的部分原因。
推荐阅读
- arm - 检测 Thumb-2 指令和 PC 偏移的位置
- matlab - 找到线性系统精确解的最快方法是什么,matlab
- c# - 为什么此 LINQ 表达式返回只有一项的子列表
- redux - Immutable.js:创建一个包含一个元素的列表
- javascript - 触发 Modal 以在 useEffect 挂钩内显示的问题
- javascript - AWS Lambda 函数:无法读取未定义的属性 'logs' 'numberOfPages' 'stream'。包问题或 AWS Lambda 问题?
- html - 如何使用 CSS 隐藏行中的内联元素溢出?
- mysql - 如何允许我的团队成员访问我的 AWS mySQL 数据库?
- python - 如何在数据框中选择 NaN 单元格?
- reactjs - 开玩笑测试未通过创建反应应用程序