RuntimeWarning:在日志中遇到被零除

问题描述 投票:0回答:6

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

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

但是,

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

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

python numpy
6个回答
35
投票

您可以使用 seterr 将其关闭

numpy.seterr(divide = 'ignore') 

然后继续

numpy.seterr(divide = 'warn') 

31
投票

numpy.log10(prob)
计算
prob
的所有元素的以 10 为底的对数,即使是那些没有被
where
选择的元素。如果需要,您可以在取对数之前用
prob
或一些虚拟值填充
10**-10
的零点以解决问题。 (不过,请确保您不使用虚拟值计算
prob > 0.0000000001
。)


23
投票

只需在

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]

7
投票

我通过找到数组中最低的非零数字并将所有零替换为低于最低的数字来解决这个问题: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)

请注意,所有数字都会添加一小部分。


2
投票

只需指定

where
即可计算
log10
如下:

 result = np.log10(prob,where=prob>0)

这是一个演示:


1
投票

这个解决方案对我有用,使用

numpy.sterr
关闭
warnings
然后
where

numpy.seterr(divide = 'ignore')
df_train['feature_log'] = np.where(df_train['feature']>0, np.log(df_train['feature']), 0)
© www.soinside.com 2019 - 2024. All rights reserved.