Desbordamiento encontrado en la función numpy.exp() en Python
El NumPy
es un paquete de Python que es rico en utilidades para jugar con grandes matrices y arreglos multidimensionales y realizar operaciones matemáticas tanto complejas como sencillas sobre ellos.
Estas utilidades son dinámicas para las entradas y altamente optimizadas y rápidas. El paquete NumPy
tiene una función exp()
que calcula el exponencial de todos los elementos de un array numpy de entrada.
En otras palabras, calcula ex, x
es cada número del array numpy de entrada, y e
es el número de Euler que es aproximadamente igual a 2.71828
.
Dado que este cálculo puede dar como resultado un número enorme, algunos tipos de datos no pueden manejar valores tan grandes y, por lo tanto, esta función devolverá inf
y un error en lugar de un valor flotante válido.
Por ejemplo, esta función devolverá 8.21840746e+307
para numpy.exp(709)
pero runtimeWarning: overflow found in exp inf
para numpy.exp(710)
.
En este artículo, aprenderemos cómo solucionar este problema.
Corrección de desbordamiento en la función numpy.exp()
en Python NumPy
Tenemos que almacenar valores en un tipo de datos capaz de contener valores tan grandes para solucionar este problema.
Por ejemplo, np.float128
puede contener números mucho más grandes que float64
y float32
. Todo lo que tenemos que hacer es encasillar cada valor de un array a un tipo de datos más grande y almacenarlo en un array numpy.
El siguiente código de Python muestra esto.
import numpy as np
a = np.array([1223, 2563, 3266, 709, 710], dtype=np.float128)
print(np.exp(a))
Producción :
[1.38723925e+0531 1.24956001e+1113 2.54552810e+1418 8.21840746e+0307
2.23399477e+0308]
Aunque el código de Python anterior se ejecuta a la perfección sin ningún problema, aún así, somos propensos al mismo error.
La razón detrás de esto es bastante simple; incluso np.float128
tiene un valor de umbral para los números que puede contener. Cada tipo de datos tiene un límite superior, y si se cruza ese límite superior, las cosas comienzan a tener errores y los programas comienzan a ejecutar errores de desbordamiento.
Para comprender el punto mencionado anteriormente, consulte el siguiente código de Python. Aunque np.float128
resolvió nuestro problema en el último fragmento de código de Python, no funcionaría para valores aún mayores.
import numpy as np
a = np.array([1223324, 25636563, 32342266, 235350239, 27516346320], dtype=np.float128)
print(np.exp(a))
Producción :
<string>:4: RuntimeWarning: overflow encountered in exp
[inf inf inf inf inf]
La función exp()
devuelve un infinito para cada valor en la matriz numpy.
Para conocer la función
numpy.exp()
, consulte la documentación oficial deNumPy
aquí.