2011-05-17 12 views
20

Correrpython + numpy: ¿por qué numpy.log arroja un error de atributo si su operando es demasiado grande?

np.log(math.factorial(21)) 

lanza una AttributeError: log. ¿Porqué es eso? Me podría imaginar un ValueError, o algún tipo de UseYourHighSchoolMathsError, pero ¿por qué el error de atributo?

+4

Supongo que NumPy primero intenta convertir el argumento a uno de sus tipos escalares y luego intenta acceder a algún atributo específico de NumPy. 'math.factorial (21)' excede el tamaño de 'numpy.uint64', por lo que no se puede convertir a un escalar NumPy. ¡Por supuesto NumPy * debería * lanzar un 'ValueError'! –

+0

Vea también [AttributeError en python/numpy al construir la función para ciertos valores] (/ questions/18833639/attributeerror-in-python-numpy-when-constructing-function-for-certain-values) – tripleee

Respuesta

24

El resultado de math.factorial(21) es un pitón largo. numpy no puede convertirlo a uno de sus tipos numéricos, por lo que lo deja como dtype=object. La forma en que uaryun únicos trabaja para las matrices de objetos es que simplemente intentan llamar a un método del mismo nombre en el objeto. P.ej.

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

Puesto que no hay .log() método en un pitón de largo, se obtiene la AttributeError.

+1

Wow, esto explica una gran cantidad de cosas –

4

Prefiere la función math.log(), que hace el trabajo incluso en enteros largos.

Cuestiones relacionadas