2015-04-29 23 views
13

Mam funkcję kwestii Statystyki:Ignoruj ​​dzielenie przez 0 ostrzeżenia w Pythonie

import numpy as np 
from scipy.special import gamma as Gamma 

def Foo(xdata): 
    ... 
    return x1 * (
       (#R is a numpy vector 
        (((R - x2)/beta) ** (x3 -1)) * 
        (np.exp(- ((R - x2)/x4)))/
        (x4 * Gamma(x3)) 
       ).real 
       ) 

czasami mam z powłoki następujące ostrzeżenie:

RuntimeWarning: divide by zero encountered in... 

korzystać z funkcji numpy isinf skorygować wyniki funkcji w innych plikach, które muszę zrobić. więc nie muszę być ostrzeżeniem.

Istnieje sposób, aby zignorować wiadomość? Innymi słowy, nie chcę, aby powłoka drukowała tę wiadomość.

Nie chcę wyłączyć wszystkie ostrzeżenia Pythona, tylko ten.

+0

Można go po prostu złapać i zignorować, jeśli nie trzeba go odzyskiwać. – Carcigenicate

+0

zawsze możesz użyć 'try ... except ZeroDivisionError' (lub innego błędu) – letsc

+3

możliwy duplikat [Jak wyłączyć ostrzeżenia Pythona] (http://stackoverflow.com/questions/14463277/how-to-dable -python-warning) – marsh

Odpowiedz

32

Możesz wyłączyć ostrzeżenie za pomocą numpy.seterr. Umieść to przed możliwym podziałem przez zero:

np.seterr(divide='ignore') 

To będzie wyłączać ostrzeżenia o zerowym dzieleniu na całym świecie. Jeśli chcesz po prostu wyłączyć je na trochę, można użyć numpy.errstate w with klauzuli:

with np.errstate(divide='ignore'): 
    # some code here 

Dla zero zero podziału (nieokreślona, ​​prowadzi do NaN), zachowanie błąd zmieniono z numpy w wersji 1.12.0: jest to teraz uważane za "nieprawidłowe", a poprzednio było "dzielone".

Tak więc, jeśli istnieje szansa, że ​​Twój licznik może być zerowy, a także używać

np.seterr(divide='ignore', invalid='ignore') 

lub

with np.errstate(divide='ignore', invalid='ignore'): 
    # some code here 

Zobacz sekcję „Zgodność” w release notes ostatni akapit przed Sekcja "Nowe funkcje":

Porównywanie liczby zmiennoprzecinkowych NaN powoduje teraz wygenerowanie ostrzeżenia o niepoprawnym uruchomieniu. Jeśli oczekiwane jest NaN, ostrzeżenie to można zignorować za pomocą np.errstate.

4

Można również użyć podziału numpy.divide. W ten sposób nie musisz wyraźnie wyłączać ostrzeżeń.

In [725]: np.divide(2, 0) 
Out[725]: 0 
+2

dzięki. Jedyną rzeczą jest to, że nie jest to powrót inf – overcomer

Powiązane problemy