Абсолютное значение Python: давайте займемся математикой!

В этом уроке мы вычислим абсолютное значение числовых типов в Python. Мы также рассмотрим различные библиотеки, которые позволяют это вычислить.

Для вычисления абсолютного значения числа в Python можно использовать встроенную функцию abs(). Аргумент, передаваемый функции abs, может быть целым числом, числом с плавающей точкой или комплексным числом. Модули Python, такие как NumPy и Pandas, также позволяют вычислять абсолютное значение для более сложных структур данных.

Пришло время привести примеры!

Функция абсолютного значения в Python

Самый простой способ получить абсолютное значение числа в Python — использовать встроенную функцию abs().

Давайте напишем код на Python, который принимает число в качестве входных данных и возвращает абсолютное значение этого числа:

number = int(input("Please insert a number: "))
print("The absolute value of the number is {}".format(abs(number))) 

В этом случае мы предположили, что наша программа ожидает целые числа. Вывод:

Please insert a number: -4
The absolute value of the number is 4

Теперь откройте оболочку Python, чтобы увидеть абсолютное значение, возвращаемое функцией abs(), когда мы передаем ей различные типы чисел.

Целое число

>>> abs(4)
4
>>> abs(-4)
4 

Число с плавающей точкой

>>> abs(4.15)
4.15
>>> abs(-4.15)
4.15 

Вы можете видеть, что с числами типа int и float мы получаем либо int, либо float без знака.

Абсолютное значение комплексного числа

Вот что происходит с комплексным числом…

>>> abs(3+2j)
3.605551275463989
>>> abs(3-2j)
3.605551275463989
>>> abs(3-4j)
5.0
>>> abs(3+4j)
5.0 

Абсолютное значение, возвращаемое для комплексного числа, — это его величина. Величина — это расстояние комплексного числа от начала координат в комплексной плоскости.

Обратите внимание, что величина комплексного числа может иметь десятичную часть, отличную от нуля или нет.

В одном из следующих разделов мы рассмотрим математическую библиотеку Python, которую также можно использовать для вычисления абсолютного значения.

Абсолютное значение элементов в списке Python

Давайте перейдем к чему-то более интересному…

Я хочу найти способ вычислить абсолютное значение всех элементов, принадлежащих списку Python.

Как мы можем это сделать?

Есть несколько способов, мы можем начать с простого цикла for:

>>> numbers = [1, -3, -3.14, 6+3j, -11, 5]
>>> abs_numbers = []
>>> for number in numbers:
...     abs_numbers.append(abs(number))
... 
>>> abs_numbers
[1, 3, 3.14, 6.708203932499369, 11, 5] 

Я создал новый список и добавил к нему абсолютное значение каждого числа.

Легко… и есть способы сделать это лучше.

Функция карты

Запустите следующую команду в оболочке Python, чтобы проверить руководство по функции map:

>>> help(map)

функция отображения и абсолютное значение

В этом случае итерируемый объект будет представлять собой список чисел:

>>> numbers = [1, -3, -3.14, 6+3j, -11, 5]
>>> map(abs, numbers)
<map object at 0x10d9d5050>
>>> list(map(abs, numbers))
[1, 3, 3.14, 6.708203932499369, 11, 5] 

Когда мы выполняем оператор map, мы получаем объект map. Чтобы получить список обратно, мы должны преобразовать его в список с помощью функции list().

Понимание списка

И вот как мы можем использовать списочное включение, чтобы получить список, содержащий абсолютные значения всех этих чисел.

>>> numbers = [1, -3, -3.14, 6+3j, -11, 5]
>>> [abs(number) for number in numbers]
[1, 3, 3.14, 6.708203932499369, 11, 5] 

Хорошо!

Лямбда

Я также хочу попробовать использовать лямбду для этого. Лямбда изменит знак числа, если оно отрицательное:

>>> list(map(lambda x: -x if x < 0 else x, numbers))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
TypeError: '<' not supported between instances of 'complex' and 'int' 

К сожалению, это не работает с нашим текущим списком, который содержит комплексное число.

Давайте проверим этот подход на списке, который не содержит комплексных чисел:

>>> numbers2 = [1, -3, -3.14, -11, 5]
>>> list(map(lambda x: -x if x < 0 else x, numbers2))
[1, 3, 3.14, 11, 5] 

На этот раз выглядит хорошо 🙂

Абсолютное значение элементов в кортеже или наборе

Я почти уверен, что смогу вычислить абсолютное значение элементов кортежа или набора Python, используя один из методов, использованных в предыдущем разделе.

Давайте сначала подтвердим это для кортежа

>>> numbers = (1, -3, -3.14, 6+3j, -11, 5)
>>> tuple(map(abs, numbers))
(1, 3, 3.14, 6.708203932499369, 11, 5) 

И вот то же самое для набора Python:

>>> numbers = {1, -3, -3.14, 6+3j, -11, 5}
>>> set(map(abs, numbers))
{1, 3.14, 3, 5, 6.708203932499369, 11} 

Обратите внимание на разницу в порядке элементов множества, которое мы вычислили. Это связано с тем, что множество — это неупорядоченная коллекция.

Вычислите абсолютное значение с помощью NumPy

Альтернативой встроенной функции abs() для вычисления абсолютного значения числа является модуль NumPy.

>>> import numpy as np
>>> np.abs(-2)
2
>>> np.abs(-3.14)
3.14
>>> np.abs(6+3j)
6.708203932499369 

Пока что это работает так же, как встроенный метод, так какой смысл использовать его вместо этого?

Мы также можем передать список непосредственно в функцию NumPy abs()…

>>> numbers = [1, -3, -3.14, 6+3j, -11, 5]
>>> np.abs(numbers)
array([ 1.       ,  3.       ,  3.14     ,  6.70820393, 11.       ,
        5.        ])
>>> np.absolute(numbers)
array([ 1.       ,  3.       ,  3.14     ,  6.70820393, 11.       ,
        5.        ]) 

Примечание: функция absolute в NumPy такая же, как abs. Она была впервые введена в NumPy, а затем для простоты был создан псевдоним abs.

Теперь мне интересно, что произойдет, если мы передадим список встроенной функции abs():

>>> abs(numbers)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'list' 

Ладно, это определенно не работает!

Абсолютное значение матрицы в Python

Учитывая, что в предыдущем разделе мы рассмотрели NumPy, давайте посмотрим, можем ли мы также вычислить абсолютное значение элементов матрицы.

>>> x = np.matrix('1 -2 3-2j; -4.34 5 -6.54')
>>> np.abs(x)
matrix([[1.       , 2.       , 3.60555128],
        [4.34     , 5.       , 6.54      ]]) 

Работает и с матрицей. Очень удобно!

Абсолютное значение для Pandas Dataframe

И теперь, когда мы использовали NumPy…

…мы можем попробовать то же самое с фреймворком данных Pandas?

>>> df = pd.DataFrame({"Int": [1, -3, -6], "Float": [-3.14, -4.56, 5.55], "Complex": [3-2j, -4+3j, -3-9j]})
>>> df
   Int  Float             Complex
0    1  -3.14  3.000000-2.000000j
1   -3  -4.56 -4.000000+3.000000j
2   -6   5.55 -3.000000-9.000000j
>>> np.abs(df)
   Int  Float   Complex
0  1.0   3.14  3.605551
1  3.0   4.56  5.000000
2  6.0   5.55  9.486833 

Результатом является фрейм данных, в котором каждый элемент имеет абсолютное значение, которое мы и ожидали.

Кто бы мог подумать, что мы сможем сделать так много всего с абсолютным значением? 🙂

Сортировка значений словаря на основе абсолютного значения

Возможно, вам с этим не придется столкнуться в будущем, но это упражнение поможет улучшить ваши навыки программирования на Python.

Как можно отсортировать элементы словаря по абсолютному значению их значений?

>>> my_dict = {'number1': -3, 'number2': -5.45, 'number3': 2, 'number4': -10}

Первое, что нам нужно, — это отсортированная функция.

отсортированная функция и абсолютное значение

Если мы просто применим функцию сортировки к словарю, то получим ключи, упорядоченные в алфавитном порядке:

>>> sorted(my_dict)
['number1', 'number2', 'number3', 'number4'] 

Это не то, чего мы хотим…

Мы хотим, чтобы эти ключи были упорядочены на основе абсолютного значения значений, сопоставленных им в словаре.

Как видно из справки выше, функция sorted позволяет передавать ключ, который можно использовать в качестве критерия сортировки.

Во-первых, мы определим лямбда-функцию, которая принимает ключ словаря в качестве входных данных и возвращает абсолютное значение значения словаря, связанного с этим ключом.

>>> (lambda key: abs(my_dict[key]))('number1')
3  

В коде выше я определил лямбда-функцию, а затем передал ей строку ‘number1’. Таким образом я проверил логику лямбда-функции.

Теперь нам нужно использовать эту лямбду как ключ сортировки для отсортированной функции.

>>> my_dict = {'number1': -3, 'number2': -5.45, 'number3': 2, 'number4': -10}
>>> sorted(my_dict, key=lambda key: abs(my_dict[key]))
['number3', 'number1', 'number2', 'number4'] 

Если мы хотим изменить порядок на обратный, мы можем установить аргумент reverse отсортированной функции в значение True.

>>> sorted(my_dict, key=lambda key: abs(my_dict[key]), reverse=True)
['number4', 'number2', 'number1', 'number3'] 

Разница во времени между датами с использованием абсолютного значения

В вашей программе на Python вам может потребоваться вычислить разницу в секундах между двумя датами.

Предположим, нас интересует только абсолютное значение разницы между ними.

>>> import datetime, time
>>> date1 = datetime.datetime.now()
>>> time.sleep(10)
>>> date2 = datetime.datetime.now()
>>> delta = abs(date1 - date2)
>>> delta
datetime.timedelta(seconds=25, microseconds=287887)
>>> delta = abs(date2 - date1)
>>> delta
datetime.timedelta(seconds=25, microseconds=287887) 

Используя модуль datetime, мы получаем текущую дату в два разных момента (обратите внимание на 10-секундный сон, который добавляет некоторую дополнительную задержку).

Мы получаем тот же результат при вычислении разницы между двумя значениями дельты, поскольку мы применили абсолютное значение к обеим разностям.

Вот что мы получаем без применения абсолютного значения:

>>> delta = date1 - date2
>>> delta
datetime.timedelta(days=-1, seconds=86374, microseconds=712113)
>>> delta = date2 - date1
>>> delta
datetime.timedelta(seconds=25, microseconds=287887) 

Заключение

В этом уроке мы рассмотрели несколько способов вычисления абсолютного значения в Python с использованием стандартной библиотеки Python и таких модулей, как NumPy и Pandas.

Мы также увидели гибкость, которую обеспечивает Python при решении одной и той же проблемы разными способами.

Надеюсь, вы нашли то, что искали, и дайте мне знать в комментариях, если вы хотели бы увидеть в этой статье что-то еще, что я еще не рассмотрел.

Автор

Фото аватара

Владимир Михайлов

Программист на Python с большим количеством опыта и разнообразных проектов.