【问题标题】:RuntimeWarning: divide by zero encountered in logRuntimeWarning:在日志中遇到除以零
【发布时间】:2014-03-03 19:53:38
【问题描述】:

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

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

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

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

【问题讨论】:

  • numpy.log10(prob) 在评估 where 之前被评估。
  • 请注意,您最终可以将numpy.seterrcatch_warnings 结合使用来更改numpy 除以零的行为。请参阅this 相关问题。

标签: python numpy


【解决方案1】:

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

【讨论】:

  • 实现此目的的一种方法是使用 numpy.where 两次:prob_tmp = numpy.where(prob > 1.0e-10, prob, 1.0e-10), result = numpy.where(prob > 1.0e-10, numpy.log10(prob_tmp), -10)
【解决方案2】:

你可以用seterr关闭它

numpy.seterr(divide = 'ignore') 

然后继续

numpy.seterr(divide = 'warn') 

【讨论】:

  • 稍微好一点:使用上下文管理器:with numpy.errstate(divide='ignore'):
【解决方案3】:

只需在np.log10 中使用where 参数

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]

【讨论】:

  • 最佳清洁解决方案。我也会把它放在一个小函数中以供重复使用。
  • def safe_log10(x, eps=1e-10): result = np.where(x > eps, x, -10) np.log10(result, out=result, where=result > 0) return result
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多