Python RuntimeWarning:在日志中遇到被零除的情况

Python RuntimeWarning:在日志中遇到被零除的情况,python,numpy,Python,Numpy,我使用numpy.log10计算概率值数组的日志。数组中有一些零,我正在尝试使用 result = numpy.where(prob > 0.0000000001, numpy.log10(prob), -10) 然而,RuntimeWarning:divide by zero在log10中遇到的问题仍然出现,我确信是这一行引起了警告 虽然我的问题已经解决,但我还是不明白为什么会一次又一次出现此警告?numpy.log10(prob)计算prob的所有元素的10进制对数,即使是where

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

result = numpy.where(prob > 0.0000000001, numpy.log10(prob), -10)
然而,
RuntimeWarning:divide by zero在log10中遇到的问题仍然出现,我确信是这一行引起了警告


虽然我的问题已经解决,但我还是不明白为什么会一次又一次出现此警告?

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

我通过查找数组中最低的非零数字并用低于最低值的数字替换所有零来解决此问题:p

产生如下代码:

def替换零(数据):
min_nonzero=np.min(数据[np.nonzero(数据)])
数据[数据==0]=min\u非零
返回数据
...
prob=替换零(prob)
结果=numpy.where(prob>0.0000000001,numpy.log10(prob),-10)
请注意,所有数字都会加上一小部分。

您可以使用

然后继续

numpy.seterr(divide = 'warn') 

这个解决方案对我有效,使用
numpy.sterr
关闭
警告
,然后使用
where

numpy.seterr(divide = 'ignore')
df_train['feature_log'] = np.where(df_train['feature']>0, np.log(df_train['feature']), 0)

只需在
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]

numpy.log10(prob)
在计算
的位置之前进行计算。请注意,您最终可以使用
numpy.seterr
catch\u警告
组合使用,以更改numpy除以零的行为。请参阅相关问题。稍好一点:使用上下文管理器:
和numpy.errstate(divide='ignore'):
最佳干净解决方案。我还将它放在一个小函数中以供重用。
def safe_log10(x,eps=1e-10):result=np.where(x>eps,x,-10)np.log10(result,out=result,where=result>0)返回结果
一种方法是使用numpy.where两次:
prob\u tmp=numpy.where(prob>1.0e-10,prob,1.0e-10)
result=numpy.where(prob>1.0e-10,numpy.log10(prob\u tmp),-10)
[1.   0.   0.75 0.75]
[  0.         -10.          -0.12493874  -0.12493874]