
Cuando se trabaja con datos, comparar valores se convierte en una tarea frecuente. Sin embargo, en muchos casos, aunque los valores deberían ser iguales, no lo son debido a errores de redondeo o imprecisiones derivadas de la representación de números en punto flotante. Esto puede hacer que las comparaciones directas arrojen resultados incorrectos, lo que obliga a adoptar estrategias alternativas para realizar la comparación de arrays en NumPy.
Una solución común a este problema es realizar comparaciones con tolerancia, una técnica que permite establecer márgenes de error aceptables. Para ello, NumPy ofrece funciones como np.isclose()
y np.allclose()
, diseñadas para comparar valores o arrays considerando una tolerancia definida por el usuario. Estas herramientas son ideales para manejar las imprecisiones inherentes a los cálculos numéricos y asegurar comparaciones más fiables.
En esta entrada, se explorará cómo funcionan estas funciones, por qué son importantes y algunos casos prácticos donde resultan especialmente útiles.
Tabla de contenidos
Introducción al problema: Comparación de valores en punto flotante
Cuando se trabaja con números en punto flotante, no siempre es posible representarlos con precisión absoluta. Esto se debe a la forma en que las computadoras procesan los números reales, lo que puede generar pequeños errores en operaciones como divisiones, exponentes o raíces cuadradas. Estos errores, aunque inicialmente mínimos, pueden acumularse y amplificarse en cálculos posteriores.

Por ejemplo, una operación matemática que debería producir exactamente el valor 0.3
podría generar un resultado como 0.30000000000000004
. Aunque la diferencia es insignificante, comparar este resultado con 0.3
utilizando una igualdad exacta (==
) devolverá False
, lo que puede conducir a conclusiones erróneas en los análisis.
El problema se agrava al trabajar con arrays, ya que basta con que uno de los valores tenga una discrepancia numérica para que la comparación completa del array falle. Esto dificulta la obtención de conclusiones precisas y fiables cuando se dependen de dichas comparaciones.
Solución en NumPy: Uso de np.isclose()
y np.allclose()
Para resolver el problema de comparar números reales con tolerancia, NumPy ofrece dos funciones: np.isclose()
y np.allclose()
. Estas herramientas permiten realizar comparaciones más robustas y evitar errores derivados de las imprecisiones en los números en punto flotante.
¿Qué hacen estas funciones?
Aunque ambas comparten el objetivo de comparar valores considerando tolerancias, su uso difiere:
np.isclose()
: Compara elemento por elemento entre dos arrays y devuelve un array booleano, donde cada posición indica si los valores correspondientes están “lo suficientemente cercanos” dentro de la tolerancia definida.np.allclose()
: Evalúa si todos los elementos de dos arrays son cercanos dentro de la tolerancia y devuelve un único valor booleano (True
oFalse
). Es útil para realizar la validación de los arrays en generar en lugar de cada uno de los elementos.
Parámetros clave de np.isclose()
y np.allclose()
Ambas funciones permiten personalizar la tolerancia a través de dos parámetros:
rtol
(tolerancia relativa): Especifica la tolerancia relativa en función del valor esperado. Controla cuánto puede variar un valor proporcionalmente al valor de referencia.atol
(tolerancia absoluta): Define un límite absoluto para las diferencias, útil cuando los valores esperados son pequeños o cercanos a cero.
Los valores predeterminados son rtol=1e-5
y atol=1e-8
, pero pueden ajustarse según las necesidades del problema o la precisión requerida.
Ventajas para la comparación de arrays en NumPy
Estas funciones no solo son prácticas para evitar errores en comparaciones numéricas, sino que también mejoran la legibilidad del código y hacen que las comparaciones sean más confiables en cálculos sensibles a la precisión.
Ejemplos prácticos
A continuación, se muestra una serie de ejemplos donde se puede ver la utilidad de estas funciones en el trabajo diario.
Comparar dos valores con np.isclose()
Supongamos que se tiene dos valores que deberían ser iguales pero debido a errores numéricos presentan mínimas diferencias. Por ejemplo, como se muestra en el siguiente código, 0.3
y 0.1 + 0.2
no son iguales:
import numpy as np a = 0.3 b = 0.1 + 0.2 # Comparación directa print(a == b) # Comparación con np.isclose print(np.isclose(a, b)) # Comprobación de que la suma no es cero print(a - b)
False
True
-5.551115123125783e-17
La comparación directa da como resultado False
, pero la función np.isclose()
devuelve True
, el valor esperado. Esto es así porque, como se ve en el código, existe una pequeña diferencia entre ambos valores.
Comparar arrays elemento a elemento
Otra forma de entender cómo funciona np.isclose()
es comparando dos arrays donde las discrepancias entre los valores varían. Lo que se muestra en el siguiente ejemplo:
array1 = np.array([1.0, 2.0001, 3.000001]) array2 = np.array([1.0, 2.0, 3.0]) # Comparación con np.isclose resultado = np.isclose(array1, array2) print(resultado)
[ True False True]
En este caso, el resultado muestra que el primer y el tercer elementos están suficientemente ”cerca” dentro de la tolerancia predeterminada, pero el segundo elemento no.
¿Por qué ocurre esto?
- Primera posición:
1.0
y1.0
son idénticos, por lo que cumplen la tolerancia. - Segunda posición: La diferencia entre
2.0001
y2.0
es demasiado grande para la tolerancia relativa predeterminada de1e-5
, lo que da como resultadoFalse
. - Tercera posición: Aunque
3.000001
y3.0
no son exactamente iguales, la discrepancia es menor que la tolerancia relativa, por lo que devuelveTrue
.
Verificar arrays completos con np.allclose()
Si lo que se desea es comprobar si todos los elementos de dos arrays están los suficientemente cerca, pero no se desea comparar todos, se puede usar la función np.allclose()
. Como se muestra en el siguiente ejemplo:
# Verificar si todos los elementos son cercanos if np.allclose(array1, array2): print("Los arrays son similares dentro de la tolerancia.") else: print("Los arrays no son similares.")
Los arrays no son similares.
Ajustar la tolerancia en la comparación de arrays en NumPy
En ciertos casos, los valores predeterminados de tolerancia pueden no ser adecuados, tanto por ser poco exigentes como demasiado exigentes. Por lo que se pueden ajustar mediante los parámetros rtol
y atol
:
resultado = np.isclose(array1, array2, rtol=1e-4, atol=1e-5) print(resultado)
[ True True True]
Por lo que, al reducir la tolerancia, los tres valores del array se encuentran dentro del margen de error.
Conclusiones
La comparación de arrays en NumPy con tolerancias es una técnica imprescindible al trabajar con datos numéricos. Funciones como np.isclose()
y np.allclose()
ofrecen una solución eficiente y flexible para manejar las imprecisiones inherentes al cálculo en punto flotante.
Con estas herramientas, se pueden validar los resultados, garantizar la consistencia de los análisis y evitar errores derivados de diferencias mínimas en los datos.
Deja una respuesta