我正在使用 numpy.log10 来计算概率值数组的对数。数组中有一些零,我正在尝试使用
绕过它result = numpy.where(prob > 0.0000000001, numpy.log10(prob), -10)
但是,
RuntimeWarning: divide by zero encountered in log10
仍然出现,我确定是这条线引起了警告。
虽然我的问题解决了,但我很困惑为什么这个警告一次又一次出现?
numpy.log10(prob)
计算 prob
的所有元素的以 10 为底的对数,即使是那些没有被 where
选择的元素。如果需要,您可以在取对数之前用 prob
或一些虚拟值填充 10**-10
的零点以解决问题。 (不过,请确保您不使用虚拟值计算prob > 0.0000000001
。)
只需在
where
中使用
np.log10
参数
import numpy as np
np.random.seed(0)
prob = np.random.randint(5, size=4) /4
print(prob)
result = np.where(prob > 0.0000000001, prob, -10)
# print(result)
np.log10(result, out=result, where=result > 0)
print(result)
输出
[1. 0. 0.75 0.75]
[ 0. -10. -0.12493874 -0.12493874]
我通过找到数组中最低的非零数字并将所有零替换为低于最低的数字来解决这个问题:p
生成的代码如下所示:
def replaceZeroes(data):
min_nonzero = np.min(data[np.nonzero(data)])
data[data == 0] = min_nonzero
return data
...
prob = replaceZeroes(prob)
result = numpy.where(prob > 0.0000000001, numpy.log10(prob), -10)
请注意,所有数字都会添加一小部分。
这个解决方案对我有用,使用
numpy.sterr
关闭 warnings
然后 where
numpy.seterr(divide = 'ignore')
df_train['feature_log'] = np.where(df_train['feature']>0, np.log(df_train['feature']), 0)