2011-05-17 9 views
20

Esecuzionepython + numpy: perché numpy.log genera un errore di attributo se il suo operando è troppo grande?

np.log(math.factorial(21)) 

genera AttributeError: log. Perché? Potrei immaginare un ValueError, o una sorta di UseYourHighSchoolMathsError, ma perché l'errore di attributo?

+4

Suppongo che NumPy prima cerchi di convertire l'argomento in uno dei suoi tipi scalari e quindi tenta di accedere ad un attributo specifico di NumPy. 'math.factorial (21)' elimina la dimensione di 'numpy.uint64', quindi non può essere convertito in uno scalare NumPy. Ovviamente NumPy * dovrebbe * lanciare un 'Errore di Valore'! –

+0

Vedere anche [AttributeError in python/numpy quando si costruisce la funzione per determinati valori] (/ questions/18833639/attributeerror-in-python-numpy-when-constructing-function-per-certain-values) – tripleee

risposta

24

Il risultato di math.factorial(21) è un Python lungo. numpy non può convertirlo in uno dei suoi tipi numerici, quindi lo lascia come dtype=object. Il modo in cui gli ufunc unari funzionano per gli array di oggetti è che cercano semplicemente di chiamare un metodo con lo stesso nome sull'oggetto. Per esempio.

np.log(np.array([x], dtype=object)) <-> np.array([x.log()], dtype=object) 

Poiché non v'è alcun metodo .log() su una lunga Python, si ottiene il AttributeError.

+1

Wow, questo spiega un sacco di cose –

4

Preferire la funzione math.log(), che esegue il lavoro anche su numeri interi lunghi.

Problemi correlati