Ho bisogno di scrivere una funzione che rileverà se l'input contiene almeno un valore che non è numerico. Se viene trovato un valore non numerico, solleverò un errore (perché il calcolo dovrebbe restituire solo un valore numerico). Il numero di dimensioni dell'array di input non è noto in anticipo: la funzione dovrebbe fornire il valore corretto indipendentemente da ndim. Come ulteriore complicazione, l'input potrebbe essere un singolo float numpy.float64
o anche qualcosa di strano come un array a dimensione zero.
Il modo ovvio per risolvere questo problema è scrivere una funzione ricorsiva che itera su ogni oggetto iterabile nell'array finché non trova un non iterabile. Applicherà la numpy.isnan()
funzione su ogni oggetto non iterabile. Se viene trovato almeno un valore non numerico, la funzione restituirà immediatamente False. Altrimenti, se tutti i valori nell'iterabile sono numerici, alla fine restituirà True.
Funziona perfettamente, ma è piuttosto lento e mi aspetto che NumPy abbia un modo molto migliore per farlo. Qual è un'alternativa più veloce e più insensibile?
Ecco il mio mockup:
def contains_nan( myarray ):
"""
@param myarray : An n-dimensional array or a single float
@type myarray : numpy.ndarray, numpy.array, float
@returns: bool
Returns true if myarray is numeric or only contains numeric values.
Returns false if at least one non-numeric value exists
Not-A-Number is given by the numpy.isnan() function.
"""
return True
array(['None', 'None'], dtype=object)
? Un tale input dovrebbe sollevare solo un'eccezione?
float('nan') in x
. Non funziona.
contains_nan
sembra sospetta: "Restituisce falso se esiste almeno un valore non numerico". Mi sarei aspettatocontains_nan
di tornareTrue
se l'array contiene NaN.