2013-04-26 8 views
12

Esecuzione di uno script python (molto più lungo da includere qui) Ho scritto porta a un messaggio di avviso. Non so a quale riga del mio codice questo venga generato. Come posso ottenere questa informazione?UserWarning: conversione di un elemento mascherato in nan

Inoltre, cosa significa esattamente? In effetti, non sapevo che stavo usando un array mascherato di qualche tipo?

/usr/lib/pymodules/python2.7/numpy/ma/core.py:3785: UserWarning: Warning: converting a masked element to nan. 
warnings.warn("Warning: converting a masked element to nan.") 
+2

avevo messo un molte delle affermazioni di 'print' su tutti i possibili colpevoli nel tuo codice, questo ti darà una sequenza temporale di ciò che sta accadendo, da qualche parte tra il tuo' print's vedrai questo avviso, in questo modo puoi localizzare il tuo problema. Se aiuta l'avviso proviene da 'MaskedArray .__ float__', che apparentemente converte la matrice in float. Un altro modo è di modificare (temporaneamente) 'core.py' per far sì che generi informazioni utili come gli attributi dell'array. I debugger sono anche un'opzione praticabile. – gatto

+0

Le istruzioni di stampa mi hanno aiutato a trovare la riga corrispondente, grazie! Ho solo pensato che potesse esserci una soluzione più sofisticata. – HyperCube

risposta

11

È possibile utilizzare il modulo warnings per convertire gli avvisi in eccezioni. Il metodo più semplice è chiamato simplefilter. Ecco un esempio; il codice che genera l'avviso è in func2b(), quindi c'è un traceback non rivale.

import warnings 


def func1(): 
    print "func1" 

def func2(): 
    func2b() 
    print "func2" 

def func2b(): 
    warnings.warn("uh oh") 

def func3(): 
    print "func3" 


if __name__ == "__main__": 
    # Comment the following line to see the default behavior. 
    warnings.simplefilter('error', UserWarning) 
    func1() 
    func2() 
    func3() 

Quando la riga contenente la chiamata a simplefilter è commentata, l'uscita è

func1 
warning_to_exception.py:13: UserWarning: uh oh 
    warnings.warn("uh oh") 
func2 
func3 

Con quella linea incluso, si ottiene un traceback:

func1 
Traceback (most recent call last): 
    File "warning_to_exception.py", line 23, in <module> 
    func2() 
    File "warning_to_exception.py", line 9, in func2 
    func2b() 
    File "warning_to_exception.py", line 13, in func2b 
    warnings.warn("uh oh") 
UserWarning: uh oh 
2

E 'anche possibile rattoppare MaskedArray.__float__ in modo che esso solleva un'eccezione, in questo modo si vedrebbe analisi dello stack, che includerebbe il vostro codice. E le patching potrebbero essere fatte nel tuo codice, non c'è bisogno di scherzare con lo .../ma/core.py.

Esempio per squeeze():

import numpy as np 
from numpy import ma 

def raise_me(*args, **kw): 
    raise Exception('ping') 

ma.MaskedArray.squeeze = raise_me 

def test(): 
    x = np.array([(1, 1.), (2, 2.)], dtype=[('a',int), ('b', float)]) 
    m = x.view(ma.MaskedArray) 
    m.squeeze() 

def main(): 
    test() 

main() 

E uscita:

Traceback (most recent call last): 
    File "t.py", line 19, in <module> 
    main() 
    File "t.py", line 17, in main 
    test() 
    File "t.py", line 13, in test 
    m.squeeze() 
    File "t.py", line 6, in raise_me 
    raise Exception('ping') 
Exception: ping 

Come si può vedere che vi mostra la linea con m.squeeze().

Problemi correlati