我正在使用numpy.log10来计算概率值数组的日志。数组中有一些零,我试图使用
绕过它result = numpy.where(prob > 0.0000000001, numpy.log10(prob), -10)
然而,RuntimeWarning: divide by zero encountered in log10
仍然出现,我确信这条线路引起了警告。
虽然我的问题已经解决了,但我很困惑为什么这个警告会一次又一次出现?
答案 0 :(得分:19)
numpy.log10(prob)
计算prob
的所有元素的基数10对数,甚至是where
未选择的元素。如果需要,可以使用prob
填充10**-10
的零或一些虚拟值,然后再取对数来解决问题。 (但请确保您不使用虚拟值计算prob > 0.0000000001
。)
答案 1 :(得分:5)
我通过找到数组中最低的非零数字并用低于最低值的数字替换所有零来解决这个问题:p
导致代码如下:
/portal
请注意,所有数字都会添加一小部分。
答案 2 :(得分:5)
只需在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]
答案 3 :(得分:1)
答案 4 :(得分:0)
此解决方案对我有用,请使用numpy.sterr
关闭warnings
,然后关闭where
numpy.seterr(divide = 'ignore')
df_train['feature_log'] = np.where(df_train['feature']>0, np.log(df_train['feature']), 0)