2015-04-29 13 views
13

Ho una funzione per le questioni statistici:Ignora divisione per 0 avviso in pitone

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 
       ) 

A volte ricevo dalla shell il seguente avviso:

RuntimeWarning: divide by zero encountered in... 

a utilizzare la funzione NumPy isinf per correggere i risultati della funzione in altri file in cui ho bisogno di fare. quindi non ho bisogno di essere avvertito.

C'è un modo per ignorare il messaggio? In altre parole, non voglio che la shell stampi questo messaggio.

Non voglio disabilitare tutto l'avviso python, solo questo.

+0

Si potrebbe semplicemente prendere e ignorarlo se non è necessario recuperare da esso. – Carcigenicate

+0

puoi sempre usare 'prova ... eccetto ZeroDivisionError' (o qualunque errore venga lanciato) – letsc

+3

possibile duplicato di [Come disabilitare gli avvertimenti di python] (http://stackoverflow.com/questions/14463277/how-to-disable -python-warnings) – marsh

risposta

32

È possibile disattivare l'avviso con numpy.seterr. Metti questo prima della possibile divisione per zero:

np.seterr(divide='ignore') 

Ciò disabiliterà gli avvisi di divisione zero a livello globale. Se si desidera solo per disabilitare loro per un po ', è possibile utilizzare numpy.errstate in una clausola with:

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

Per uno zero per zero divisione (indeterminato, si traduce in un NaN), il comportamento di errore ha cambiato con numpy versione 1.12.0: questo è ora considerato "non valido", mentre in precedenza era "dividi".

Quindi, se c'è una possibilità che il vostro numeratore potrebbe essere pari a zero, così, utilizzare

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

o

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

Vedere la sezione "Compatibilità" nel release notes, ultimo paragrafo prima della Sezione "Nuove funzionalità":

Il confronto dei numeri in virgola mobile NaN ora genera l'avviso di runtime non valido. Se è previsto un NaN, l'avviso può essere ignorato utilizzando np.errstate.

4

È inoltre possibile utilizzare numpy.divide per la divisione. In questo modo non devi disabilitare esplicitamente gli avvisi.

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

grazie. L'unica cosa è che non viene restituito inf come risultato – overcomer