RuntimeWarning:在日志中遇到零除

Gea*_*ric 23 python numpy

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

result = numpy.where(prob > 0.0000000001, numpy.log10(prob), -10)
Run Code Online (Sandbox Code Playgroud)

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

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

use*_*ica 21

numpy.log10(prob)计算所有元素的基数10对数prob,甚至是那些未被选中的元素where.如果你愿意,你可以填写的零prob10**-10或取对数之前的一些虚拟值来摆脱这个问题.(但请确保您不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认同)

joh*_*jik 17

您可以使用seterr关闭它

numpy.seterr(divide = 'ignore') 
Run Code Online (Sandbox Code Playgroud)

然后继续

numpy.seterr(divide = 'warn') 
Run Code Online (Sandbox Code Playgroud)

  • 稍微好一点:使用上下文管理器:`with numpy.errstate(divide='ignore'):` (11认同)

Mar*_*hke 9

只需使用中的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)
Run Code Online (Sandbox Code Playgroud)

输出

[1.   0.   0.75 0.75]
[  0.         -10.          -0.12493874  -0.12493874]
Run Code Online (Sandbox Code Playgroud)

  • ```def safe_log10(x, eps=1e-10): result = np.where(x > eps, x, -10) np.log10(结果, out=结果, where=结果 > 0) 返回结果`` ` (2认同)

Ram*_*zar 5

我通过找到数组中最低的非零数并用低于最低值的数字替换所有零来解决这个问题: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)
Run Code Online (Sandbox Code Playgroud)

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