Python 获取numpy数组日志但忽略0';s

Python 获取numpy数组日志但忽略0';s,python,performance,numpy,vectorization,logarithm,Python,Performance,Numpy,Vectorization,Logarithm,我想取numpy数组的自然对数,但根本不计算0项的对数。也就是说,我想在numpy数组上实现约定log(0)=0 import numpy as np import timeit foo = np.random.rand(500) %timeit np.log(foo) %timeit np.log(foo,where=foo>0) 对于第一次调用,这将产生 最慢的跑步比最快的跑长12.63倍。这可能 表示正在缓存中间结果。10万圈,最好 每圈3:2.06µs 第二个电话,我们得到 最慢

我想取numpy数组的自然对数,但根本不计算0项的对数。也就是说,我想在numpy数组上实现约定log(0)=0

import numpy as np
import timeit
foo = np.random.rand(500)
%timeit np.log(foo)
%timeit np.log(foo,where=foo>0)
对于第一次调用,这将产生

最慢的跑步比最快的跑长12.63倍。这可能 表示正在缓存中间结果。10万圈,最好 每圈3:2.06µs

第二个电话,我们得到

最慢的跑步时间是最慢的8.35倍 最快的。这可能意味着正在缓存中间结果。 100000个回路,最佳3个:每个回路4.31µs


因此,避免0(即使在这种情况下数组中没有零)的开销要大得多。如果我们看稀疏阵列,这显然是不同的,但是在非稀疏情况下是否有更有效的方法来避免零点?

@米契麦特:你必须在信息理论的背景下考虑它,在计算熵时,我们经常遇到像0 log 0这样的情况。“你必须在信息理论的背景下考虑这一点,在计算熵时,我们经常遇到像0 log 0这样的情况。”在这种情况下,看一看,我的时间在1.131上显示:<代码> < < /> >比你长1.6x,在你的基准点上(1.133)。它更像是
1.25x
。我在做
timeit('np.log(a,where=a>0'),setup='a=np.random.rand(500'),globals=globals(),number=100000)
没有“where”也一样。如果您愿意将numba添加为依赖项,则手动循环的后jitted直接实现(带有分支)在小N时在np.log的10%以内,而在大N时对我来说实际上更快。可能值得一看。