Python RuntimeWarning:在日志中遇到被零除的情况
我使用numpy.log10计算概率值数组的日志。数组中有一些零,我正在尝试使用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
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]