2012-02-19 68 views
4

我有一個表達式對於某些參數值溢出。在這種情況下,我得出了使用筆和紙的漸近結果,而當我遇到這種情況時,我只是用我的分析表達式來代替。如何檢查數值溢出而不在Python中發出警告?

目前我的代碼確實是這樣的:

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 

注意我是如何「手動」解決問題在最後,但在我發生了什麼/ O是:

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

我做這樣一個循環計算的,所以我想沉默這些消息(因爲它們已經被固定,而且他們採取了很多的時間進行打印)

+4

如果您發佈的代碼實際上會顯示您詢問的問題,而不是用佔位符替換它,通常會有所幫助。它使讀者擺脫了自己的榜樣。 – Marcin 2012-02-19 13:21:25

+0

嘗試捕捉(除了)「ArithmeticError」異常。 – gimel 2012-02-19 13:29:09

+0

@Marcin:它發生在一個非常複雜的代碼之間,有幾個被定義的對象。但是你是對的,我會舉一個小例子來展示我所追求的。謝謝 – matiasq 2012-02-19 13:33:42

回答

5

您可以通過numpy.seterr(over='ignore')沉默溢出警告,請參閱http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html

+0

:謝謝你的回答。這個解決方案的問題是,我沉默了一切,而不僅僅是這個功能,這是我想要的。 – matiasq 2012-02-20 12:43:28

+2

你可以做'olderr = numpy.seterr(over ='ignore');嘗試:func();最後:numpy.seterr(**更老)' – 2012-02-20 19:44:40

+2

你可以使用with語句:http://docs.scipy.org/doc/numpy/reference/generated/numpy.errstate.html#numpy.errstate – tillsten 2012-02-20 21:50:40

2

假設警告使用Python警告系統,則可以使用警告模塊as shown in the documentation中的catch_warnings()simplefilter()函數。

如果警告不使用該系統,則更爲複雜。

0

,最好的方法是手動檢查你的表達,並找出哪些輸入參數的範圍可以由您明確的代碼來準確地處理。精度的顯着損失可能比數值溢出快得多。

然後,您應該對輸入變量有一個明確的「if」語句,並對所有數值錯誤已知過高的值使用漸近表達式。您可能需要增加漸近式展開的詞條數量,例如通過做關於無限的泰勒級數。爲了避免手工操作的乏味,您可能會發現maxima非常有幫助。

+0

謝謝你的回答。我有點擔心這是唯一的解決方案,但我想先調查其他選項,明確地「沉默」錯誤。 – matiasq 2012-02-20 12:47:06