Почему встроенная функция abs () не работает со списками Python, но корректно работает с массивами NumPy и сериями pandas (поскольку она будет векторизована)? - PullRequest
0 голосов
/ 29 мая 2020

Почему встроенная функция abs() не работает со списками Python, но корректно работает с массивами NumPy и сериями pandas?

Применение встроенной функции abs() к Python list вызывает исключение

TypeError: неверный тип операнда для abs (): 'list'

Ничего удивительного, это соответствует документации:

abs (x)
Возвращает абсолютное значение числа. Аргумент может быть целым числом или числом с плавающей запятой. Если аргумент является комплексным числом, возвращается его величина.

Но та же функция ведет себя правильно (как векторизованная функция) для NumPy массивов и pandas серий:

In[2]: lst = [2, 0, -1]
In[3]: # abs(lst)             # bad operand type for abs(): 'list'

In[4]: import numpy as np
In[5]: arr = np.array(lst)
In[6]: abs(arr)               # no problem
Out[6]: array([2, 0, 1])

In[7]: import pandas as pd
In[8]: s = pd.Series(lst)
In[9]: abs(s)                 # no problem
Out[9]: 
0    2
1    0
2    1
dtype: int64

In[10]: abs.__class__
Out[10]: builtin_function_or_method

Как это возможно?

1 Ответ

4 голосов
/ 29 мая 2020

Цитированная документация устарела.

В новой документации (для Python 3.8.3) указано:

abs (x)
Возвращает абсолютное значение числа. Аргумент может быть целым числом или числом с плавающей запятой. Если аргумент - комплексное число, возвращается его величина. Если x определяет __abs __ (), abs (x) возвращает x .__ abs __ ().

Последнее предложение новое и объясняет вопрос:

NumPy ndarray class и pandas Series class определяют метод magi c __abs__().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...