如何检查数字溢出而不在Python中收到警告?

时间:2012-02-19 13:10:26

标签: python numpy overflow

我有一个表达式溢出某些参数值。在这种情况下,我已经得出了使用笔和纸的渐近结果,当我有这样的情况时,我只用我的分析表达式替换。

目前我的代码做了类似的事情:

values = ExpressionThatOverFlows()
# Check the ones that overflow
indOverFlow = isnan(values)
# Set them to the values I derived by pen and paper
values[indOverFlow] = derivedValues

我的问题是I / O爆炸了“警告”。我知道它警告我很好,但我明确地照顾它,所以我想让它们沉默。请注意,我不想让所有类型的“溢出”警告静音,只有这里的警告。我认为这样的事情会起作用,但事实并非如此:

try:
   values = ExpressionThatOverFlows()
except Warning:
   pass
# and the rest of the code as it is

我已经检查了一下,但我似乎只是想找到如何在整个会话中或者永远停止这些警告,但这正是我指出的不是我想要的。

感谢您的帮助,非常感谢。

编辑:这里有一个小得多的代码,它会产生我遇到的问题:

from scipy import log1p, exp
from numpy import array, isnan

a = array([0.2222, 500.3, 0.3, 700.8, 0.111])

values = log1p(-exp(-exp(10**a - 9**a)))

print values # Note the nan's

indOverflow = isnan(values)
values[indOverflow] = 0

请注意我最后如何“手动”修复问题,但I / O中会发生什么:

Warning: overflow encountered in power
Warning: overflow encountered in power
Warning: invalid value encountered in subtract

我在循环中进行这种计算,所以我想要静音这些消息(因为它们已经被修复,而且它们需要花费大量时间来打印)

3 个答案:

答案 0 :(得分:5)

您可以通过numpy.seterr(over='ignore')对溢出警告进行静音,请参阅http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html

答案 1 :(得分:2)

假设警告使用Python警告系统,您可以使用警告模块as shown in the documentation中的catch_warnings()simplefilter()函数。

如果警告不使用该系统,则会更复杂。

答案 2 :(得分:0)

最好的方法是手动检查表达式,找出显式代码可以准确处理哪些输入参数范围。有可能比数值溢出更快地发生显着的精度损失。

然后,您应该在输入变量上使用明确的“if”语句,并对已知数值误差过高的所有值使用渐近表达式。您可能需要增加渐近展开中的术语数量,例如通过做一个关于无限的泰勒系列。为避免单手乏味,您可能会发现maxima非常有帮助。