为什么内置函数 abs() 不适用于 Python 列表,但可以与 NumPy 数组和 pandas 系列正常工作(因为它会被矢量化)?



为什么内置函数abs()不适用于 Python 列表,但可以与 NumPy 数组和 pandas 系列正常工作?

将内置abs()函数应用于 Python 列表会引发异常

类型错误: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

怎么可能?

引用的文档已过时。

新文档(适用于 Python 3.8.3(指出:

abs(x(
返回数字的绝对值。参数可以是整数或浮点数。如果参数是复数,则返回其大小。如果 x 定义 __abs__((,则 abs(x( 返回 x.__abs__((。

最后一句是新的,它解释了这个问题:

NumPyndarray类和 pandasSeries类都定义了魔术__abs__()方法。

最新更新