raiz power log cuadrada python numpy exponentiation

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