在Python中使用numpy / scipy记录非常小的值

时间:2010-11-17 16:17:38

标签: python numpy scipy numerical-methods

我有一个对应于概率分布的Nx1数组,即元素之和总和为1.这表示为常规的numpy数组。由于N可能相对较大,例如10或20,许多单独的元素非常接近0.我发现当我采用log(my_array)时,我得到错误“FloatingPointError:在日志中遇到无效值”。请注意,这是在故意设置numpy中的seterr(invalid ='raise')之后。

我该如何处理这个数字问题?我想表示对应于概率分布及其记录的向量而不舍入为0,从那以后我最终得到log(0),这会引起错误。

感谢。

4 个答案:

答案 0 :(得分:3)

您可以根据所需的准确度放下尾巴。

eps = 1e-50
array[array<eps]=eps
log(array)

答案 1 :(得分:2)

什么非常接近于零?

>>> np.log(0)
-inf
>>> 0.*np.log(0)
nan
>>> np.log(1e-200)
-460.51701859880916
>>> 1e-200*np.log(1e-200)
-4.6051701859880914e-198

一种解决方案是在所有概率上加一个小的正数,以限制它们远离零。

第二个解决方案是显式处理零,例如在结果数组中用零替换0. * np.log(0),或者仅包括概率数组中具有非零概率的点

答案 2 :(得分:1)

他们的“非常接近”是多少? Python似乎很高兴记录10 ^ -very large:

>>> log(0.0000000000000000000000000001)
-64.472382603833282

另外,你为什么要记录日志?一旦你服用它们,你打算用它们做什么?

答案 3 :(得分:0)

根据您之后所做的事情,您可以使用不像log那样在零值上爆炸的不同变换。也许是sigmoid function或其他具有明确定义的雅可比行列式的东西。

如果您只想查看数据,可以在记录日志之前添加一些微小的值。