RuntimeWarning:在日志中遇到零除

时间:2014-02-06 17:44:43

标签: python numpy

我正在使用numpy.log10来计算概率值数组的日志。数组中有一些零,我试图使用

绕过它
result = numpy.where(prob > 0.0000000001, numpy.log10(prob), -10)

然而,RuntimeWarning: divide by zero encountered in log10仍然出现,我确信这条线路引起了警告。

虽然我的问题已经解决了,但我很困惑为什么这个警告会一次又一次出现?

5 个答案:

答案 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)

您可以使用seterr

将其关闭
numpy.seterr(divide = 'ignore') 

然后继续

numpy.seterr(divide = 'warn') 

答案 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)