В этом уроке мы вычислим абсолютное значение числовых типов в 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 при решении одной и той же проблемы разными способами.
Надеюсь, вы нашли то, что искали, и дайте мне знать в комментариях, если вы хотели бы увидеть в этой статье что-то еще, что я еще не рассмотрел.