Header Ads Widget

Ticker

6/recent/ticker-posts

Cómo calcular el valor absoluto en Python: Control de flujo, Abs () y más

 Como Python se usa cada vez más para la computación, se vuelve más importante que los recursos relacionados con las matemáticas estén disponibles. Para ayudar en ese esfuerzo, pensé que compartiría algunas formas de calcular el valor absoluto en Python.

Resulta que hay algunas formas de calcular el valor absoluto en Python. En primer lugar, está la abs()función que viene incorporado en forma alternativa, hay una expresión aritmética que hace el trabajo.: (x**2)**0.5Finalmente, una prueba rápida negativa (es decir if x < 0: x = -x, también funciona. La que elija depende de sus necesidades. Afortunadamente, profundizaremos en los detalles a continuación.

Descripción del problema

En matemáticas, el valor absoluto de un número es su magnitud (es decir, ignore el signo). Por ejemplo, el valor absoluto de 7 es 7. Mientras tanto, el valor absoluto de -9 es 9.

Naturalmente, el valor absoluto se usa en muchos lugares diferentes de las matemáticas. Por ejemplo, si viajamos hacia y desde la tienda de comestibles, nuestro desplazamiento es cero. Después de todo, nuestro punto de partida y final es el mismo. O para verlo de otra manera, los dos tramos del viaje estaban a la misma distancia con signos opuestos:

1
2
3
leg1 = 15  # miles
leg2 = -15  # miles
displacement = leg1 + leg2

Para calcular la distancia total recorrida, calcularíamos el valor absoluto de cada tramo antes de sumarlos:

1
distance = |leg1| + |leg2|

Por supuesto, si fuera tan fácil representar operaciones como el valor absoluto en Python, probablemente no estaría aquí. En otras palabras, tenemos que hacer esto de otra manera. Afortunadamente, cubriremos algunas soluciones a continuación.

Soluciones

Cuando me propuse escribir este artículo, solo conocía dos formas de calcular el valor absoluto en Python. Resulta que hay al menos tres formas de hacerlo:

  • A mano
  • Matemáticamente
  • Funcionalmente

A continuación, desglosaremos cada solución con un ejemplo. Luego, en la siguiente sección, verificaremos el rendimiento de cada solución.

Calcular el valor absoluto a mano

Si el problema con el cálculo de un valor absoluto es el signo, entonces hay una solución bastante sencilla:

1
2
3
x = -5
if x < 0:
  x = -x

Aquí, verificamos si nuestro valor es negativo. Si es así, lo negamos. De esa manera, los valores positivos permanecen positivos y los valores negativos se vuelven positivos.

Una forma en la que he obtenido valor de esta solución es en un programa donde los números impulsan la lógica. Por ejemplo, digamos que tenemos un programa que realiza una acción basada en un número ingresado por el usuario. En este programa, el número determina cuántas veces ocurre la acción mientras que el letrero controla qué acción ocurre.

En este programa, es útil asumir que el usuario ingresará un número positivo. De esa manera, podemos usar el número positivo para impulsar un bucle. Si el usuario no ingresa un número positivo, podemos usar esta rama para actualizar nuestra acción esperada y calcular el valor absoluto.

Dicho esto, generalmente creo que las otras soluciones de este artículo son más útiles.

Calcular valor absoluto usando matemáticas

Cuando estaba elaborando este artículo, sabía que había esencialmente dos formas de calcular el valor absoluto: usar una rama o usar una función. En ese momento, sin embargo, no estaba al tanto del siguiente truco matemático:

1
2
x = -5
x = (x**2)**.5

Si alguna vez ha realizado estadísticas o aprendizaje automático, es posible que sepa que a menudo cuadramos los valores, por lo que no tenemos que lidiar con números negativos (por ejemplo, el error cuadrático medio). Es exactamente por eso que cuadramos nuestro valor aquí. Por ejemplo, -2 y 2 son 4 al cuadrado.

Una vez que tenemos nuestros valores al cuadrado, podemos generar el valor absoluto tomando la raíz cuadrada. En la mayoría de los lenguajes, calcular la raíz cuadrada es un poco complicado; probablemente justificaría otro artículo. Afortunadamente, Python incluye el poder como una de las operaciones estándar. Como resultado, podemos calcular la raíz cuadrada elevando nuestra base a 1/20.5.

Al final, terminaremos con el valor absoluto esperado con algunas advertencias:

Primero, esta solución produce un valor de punto flotante. En este caso, xpasará de -55.0Como resultado, si planeamos usarlo xcomo contador de bucle, probablemente querremos convertirlo en un número entero.

En segundo lugar, los errores de redondeo de los valores de coma flotante pueden convertirse en un problema. No pude generar ninguno, pero sospecho que es posible obtener un valor absoluto inesperado con este método.

Si no quiere lidiar con estos problemas, siempre hay otra solución.

Calcular el valor absoluto mediante la biblioteca estándar

Convenientemente, Python ha embotellado el concepto de valor absoluto para su uso en la biblioteca estándar. De hecho, no es necesario importar ningún módulo. La siguiente función funciona desde el primer momento:

1
2
x = -5
x = abs(x)

En otras palabras, si necesita calcular un valor absoluto directamente, por ejemplo, como parte de una expresión, este es el camino a seguir.

Actuación

En este punto, creo que vale la pena analizar cada una de estas soluciones desde una perspectiva de desempeño. Para hacer eso, necesitaremos construir algunos fragmentos de código equivalentes:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
dieciséis
setup = """
x = -5
"""
 
control_flow = """
if x < 0:
  -x
"""
 
mathematics = """
(x**2)**0.5
"""
 
function = """
abs(x)
"""

Como puede ver, simplifiqué un poco estas expresiones porque solo quería observar los efectos del cálculo del valor absoluto. En otras palabras, ninguna de estas expresiones cambia realmente xVeamos cómo se desarrollan:

1
2
3
4
5
6
7
>>> import timeit
>>> min(timeit.repeat(setup=setup, stmt=control_flow))
0.04148059999988618
>>> min(timeit.repeat(setup=setup, stmt=mathematics))
0.3548131000002286
>>> min(timeit.repeat(setup=setup, stmt=function))
0.05475890000025174

Resulta que la sucursal es en realidad la opción más rápida. Sospecho que la abs()función es un poco más lenta debido a la llamada a la función. En cualquier caso, tenía curiosidad por ver cómo escalan estas soluciones, así que decidí cambiar xa un número mucho mayor:

1
2
3
4
5
6
7
8
9
>>> setup = """
x = -51310834193491
"""
>>> min(timeit.repeat(setup=setup, stmt=control_flow))
0.06167479999976422
>>> min(timeit.repeat(setup=setup, stmt=mathematics))
0.5422766000001502
>>> min(timeit.repeat(setup=setup, stmt=function))
0.07209680000005392

Una vez más, los resultados fueron más o menos iguales. Nuestra sencilla solución de control de flujo es bastante rápida.

Finalmente, decidí mirar un número positivo:

1
2
3
4
5
6
7
8
9
>>> setup = """
x = 51310834193491
"""
>>> min(timeit.repeat(setup=setup, stmt=control_flow))
0.0271256999999423
>>> min(timeit.repeat(setup=setup, stmt=mathematics))
0.5370481999998447
>>> min(timeit.repeat(setup=setup, stmt=function))
0.05108329999984562

Como no hay bifurcaciones, obtenemos un pequeño aumento de rendimiento con nuestro flujo de control y nuestras abs()soluciones. Desafortunadamente, la solución matemática es lenta sin importar cómo la ejecutes. No es de extrañar que nunca lo haya visto en la práctica.

Como siempre, tome estos casos de prueba con un grano de sal. Los ejecuté usando Python 3.7.3 en una máquina con Windows; Su experiencia puede ser diferente. Si está interesado en aprender más sobre este proceso de prueba de rendimiento, tengo un artículo para eso.

Desafío

Como prometí, he traído consigo un desafío que aprovecha el valor absoluto. En particular, este desafío está relacionado con el ejemplo proporcionado en la solución de flujo de control:

Digamos que tenemos un programa que realiza una acción basada en un número ingresado por el usuario. En este programa, el número determina cuántas veces ocurre la acción mientras que el letrero controla qué acción ocurre.

Más específicamente, escriba un programa que genere |x|signos más si el número es positivo y |x|signos negativos en caso contrario. Aquí xestá el número ingresado por el usuario. Como resultado, el programa debería comportarse de la siguiente manera:

1
2
3
4
>>> "Enter a number": 7
+++++++
>>> "Enter a number": -5
-----

Como mencioné, probablemente resolvería este problema usando nuestra muestra de flujo de control. Por supuesto, puede utilizar cualquier solución disponible para usted. ¡Solo recuerda dejarlo en los comentarios! También compartiré la mía allí.

Un pequeño resumen

Con todo eso fuera del camino, echemos un vistazo a nuestras formas de calcular el valor absoluto una vez más:

01
02
03
04
05
06
07
08
09
10
11
x = -37
 
# Compute absolute value by brute force
if x < 0:
  x = -x
 
# Compute absolute value by arithmetic
x = (x**2)**0.5
 
# Compute absolute value with standard library
x = abs(x)

Como siempre, si te gustó este artículo, no dudes en mostrarle un poco de amor dejando un comentario, compartiéndolo o de cualquier otra manera . Si este artículo le interesó, los siguientes artículos están muy relacionados:

Publicar un comentario

0 Comentarios