我使用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.如果你愿意,你可以填写的零prob用10**-10或取对数之前的一些虚拟值来摆脱这个问题.(但请确保您不prob > 0.0000000001使用虚拟值进行计算.)
joh*_*jik 17
您可以使用seterr关闭它
numpy.seterr(divide = 'ignore')
Run Code Online (Sandbox Code Playgroud)
然后继续
numpy.seterr(divide = 'warn')
Run Code Online (Sandbox Code Playgroud)
只需使用中的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)
我通过找到数组中最低的非零数并用低于最低值的数字替换所有零来解决这个问题: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)
请注意,所有数字都会添加一小部分.
| 归档时间: |
|
| 查看次数: |
43280 次 |
| 最近记录: |