Python

Comparación de arrays en NumPy: Uso de np.allclose() y np.isclose() para comparaciones con tolerancia

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.

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 o False). 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 y 1.0 son idénticos, por lo que cumplen la tolerancia.
  • Segunda posición: La diferencia entre 2.0001 y 2.0 es demasiado grande para la tolerancia relativa predeterminada de 1e-5, lo que da como resultado False.
  • Tercera posición: Aunque 3.000001 y 3.0 no son exactamente iguales, la discrepancia es menor que la tolerancia relativa, por lo que devuelve True.

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.

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez
Tags: NumPy

Recent Posts

Curiosidad: La maldición de la dimensionalidad, o por qué añadir más datos puede empeorar tu modelo

En el mundo del análisis de datos solemos escuchar una idea poderosa: cuantos más datos,…

5 días ago

Error npm ERR! code EACCES al instalar paquetes en Node.js: Cómo solucionarlo paso a paso

¿Te has encontrado con este error al intentar instalar paquetes con npm? npm ERR! code…

7 días ago

Curiosidad: La Paradoja de Simpson, o por qué no siempre debes fiarte de los promedios

En ciencia de datos y estadística, los promedios y porcentajes son herramientas fundamentales para resumir…

2 semanas ago

Copias de seguridad automáticas en SQL Server con rotación de archivos

Las bases de datos son el corazón de casi cualquier sistema de información moderno. Ya…

2 semanas ago

Curiosidad: La Ley de Twyman y la trampa de los datos “interesantes”

En ciencia de datos, pocas cosas llaman más la atención de los científicos de datos…

3 semanas ago

Cómo calcular el tamaño de la muestra para encuestas

Calcular adecuadamente el tamaño de la muestra es una parte esencial en el diseño de…

3 semanas ago

This website uses cookies.