【问题标题】:Why numpy's where operation is faster than apply function?为什么 numpy 的 where 操作比 apply 函数快?
【发布时间】:2019-09-30 06:23:42
【问题描述】:

在基于某些条件在 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 是用于逐行循环的语法糖。在您的其他 sn-p 中,它作用于整个列

标签: python pandas numpy


【解决方案1】:

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 所以它是按行的。

你的另一个sn-p

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 快。

【讨论】:

  • 谢谢,EdChum,您能否解释一下 numpy 如何使矢量化操作更快。是因为并行化使用线程还是多处理?
  • 如果我们使用广播作为结果类型,这是否有助于矢量化应用?它没有意义,apply应该足够聪明。
  • @prosti 不会有任何区别,该参数用于确定将返回什么形状,这里因为它是逐行的,所以无关紧要
  • @ashish14 查看更新,这超出了此答案的范围
猜你喜欢
  • 2013-08-24
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 2014-05-28
  • 2014-11-07
  • 2013-12-07
  • 2016-04-09
相关资源
最近更新 更多