我有一个表达式溢出某些参数值。在这种情况下,我已经得出了使用笔和纸的渐近结果,当我有这样的情况时,我只用我的分析表达式替换。
目前我的代码做了类似的事情:
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
我在循环中进行这种计算,所以我想要静音这些消息(因为它们已经被修复,而且它们需要花费大量时间来打印)
答案 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非常有帮助。