【问题标题】:Why builtin function abs() don't work with Python lists, but works correctly with NumPy arrays and pandas series (as it would be vectorized)?为什么内置函数 abs() 不适用于 Python 列表,但适用于 NumPy 数组和 pandas 系列(因为它会被矢量化)?
【发布时间】:2020-05-29 12:14:16
【问题描述】:

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

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

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

这怎么可能?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    引用的文档已过时。

    new documentation(适用于 Python 3.8.3)声明:

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

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

    NumPy ndarray 类和 pandas Series 类都定义了神奇的 __abs__() 方法。

    【讨论】:

    • 感谢您指出 Python 3.8.3 文档。奇怪的是,3.6 的文档省略了 __abs__() 替代项 (docs.python.org/3.6/library/functions.html#abs),尽管我确实可以在 Python 3.6.8 下使用带有 pandas Series 的 abs 作为参数。
    猜你喜欢
    • 2014-01-24
    • 1970-01-01
    • 2020-04-24
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多