python - log - ¿Por qué numpy.power devuelve 0 para exponentes pequeños mientras que math.pow devuelve la respuesta correcta?
numpy sum (3)
(Solo una nota a pie de página de las otras dos respuestas en esta página).
Dado el ingreso de dos valores de entrada, puede verificar el tipo de datos del objeto devuelto por np.power
inspeccionando el atributo de types
:
>>> np.power.types
[''bb->b'', ''BB->B'', ''hh->h'', ''HH->H'', ''ii->i'', ''II->I'', ''ll->l'', ''LL->L'', ''qq->q'',
''QQ->Q'', ''ee->e'', ''ff->f'', ''dd->d'', ''gg->g'', ''FF->F'', ''DD->D'', ''GG->G'', ''OO->O'']
Los tipos enteros compatibles con Python son denotados por l
, flotantes de Python compatibles compatibles por d
( documents ).
np.power
decide de manera efectiva qué devolver comprobando los tipos de argumentos pasados y utilizando la primera firma coincidente de esta lista.
Por lo tanto, dados 10 y -100, np.power
coincide con el integer integer -> integer
firma integer integer -> integer
y devuelve el número entero 0
.
Por otro lado, si uno de los argumentos es un flotante, entonces el argumento entero también se convertirá en un flotante , y se usará el float float -> float
firma float float -> float
(y se devolverá el valor flotante correcto).
In [25]: np.power(10,-100)
Out[25]: 0
In [26]: math.pow(10,-100)
Out[26]: 1e-100
Espero que ambos comandos devuelvan 1e-100. Esto tampoco es un problema de precisión, ya que el problema persiste incluso después de aumentar la precisión a 500. ¿Hay alguna configuración que pueda cambiar para obtener la respuesta correcta?
El método numpy supone que quieres que se devuelva un entero ya que has proporcionado un entero.
np.power(10.0,-100)
funciona como cabría esperar
Oh, es mucho "peor" que eso:
In [2]: numpy.power(10,-1)
Out[2]: 0
Pero esto es una pista de lo que está sucediendo: 10
es un número entero, y numpy.power
no numpy.power
los números a flotar. Pero esto funciona:
In [3]: numpy.power(10.,-1)
Out[3]: 0.10000000000000001
In [4]: numpy.power(10.,-100)
Out[4]: 1e-100
Tenga en cuenta, sin embargo, que el operador de potencia, **
, se convierte en flotante:
In [5]: 10**-1
Out[5]: 0.1