python - 为什么 numpy 的 where 操作比 apply 函数快?
问题描述
在基于某些条件在 pandas 数据框中创建新列时,numpy 的 where 方法在执行时间方面优于 apply 方法,为什么会这样?
例如:
df["log2FC"] = df.apply(lambda x: np.log2(x["C2Mean"]/x["C1Mean"]) if x["C1Mean"]> 0 else np.log2(x["C2Mean"]), axis=1)
df["log2FC"] = np.where(df["C1Mean"]==0,
np.log2(df["C2Mean"]),
np.log2(df["C2Mean"]/df["C1Mean"]))
解决方案
此调用apply
是逐行迭代:
df["log2FC"] = df.apply(lambda x: np.log2(x["C2Mean"]/x["C1Mean"]) if x["C1Mean"]> 0 else np.log2(x["C2Mean"]), axis=1)
apply
只是循环的语法糖,你通过了,axis=1
所以它是按行的。
你的另一个片段
df["log2FC"] = np.where(df["C1Mean"]==0,
np.log2(df["C2Mean"]),
np.log2(df["C2Mean"]/df["C1Mean"]))
作用于整个列,因此它是矢量化的。
另一件事是pandas
执行比numpy
.
np.log2
当您传递标量值时,您的调用在这种情况下毫无意义:
np.log2(x["C2Mean"]/x["C1Mean"])
在性能方面,它与调用相同math.log2
解释为什么 numpy 明显更快或什么是矢量化超出了这个问题的范围。你可以看到:什么是矢量化?.
这里最重要的是 numpy 可以并且将使用用 C 或 Fortran 编写的外部库,这些库本质上比 python 快。
推荐阅读
- r - 使用正则表达式匹配字符串,但忽略(不排除)某些包含匹配字符串的短语
- python - 如何根据与已知参考轨迹的距离过滤掉位置数据?
- c# - 如何替换文件夹中的文件(Windows 窗体)?
- python - 如何使用 Python 脚本在浏览器中确认“甜蜜警报”?
- google-compute-engine - 如何获取 GCE 实例的标签和值列表?
- android - Flutter - 在将 android native build 升级到 flutter build 时没有发现类定义异常
- pine-script - TradingView {{close}} 不适用于警报、纯文本
- c# - 从另一个项目添加 ApiAuthorizationDbContext 迁移 - EF Core
- php - 在 Laravel 中创建 mysql 帐户用户和数据库
- php - 如何将php sql输出循环到表中?