为什么numpy的where操作比apply函数快?

时间:2019-05-13 09:51:40

标签: python pandas numpy

虽然根据某种条件在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"]))

1 个答案:

答案 0 :(得分:4)

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"]))

作用于整列,因此被矢量化了。

另一件事是,pandasnumpy执行更多的检查,索引对齐等工作。

在这种情况下,传递标量值时,您对np.log2的调用是没有意义的:

 np.log2(x["C2Mean"]/x["C1Mean"])

在性能方面,它与调用math.log2

相同

解释为什么numpy显着更快或什么是向量化超出了此问题的范围。您可以看到以下内容:What is vectorization?

这里最重要的是numpy可以并且将使用用C或Fortran编写的外部库,它们本质上比python快。

相关问题