【问题标题】:Why built-in functions like abs works on numpy array?为什么像 abs 这样的内置函数适用于 numpy 数组?
【发布时间】:2014-01-24 01:02:36
【问题描述】:

abs 适用于 numpy 数组但不适用于列表,我感到很惊讶。这是为什么呢?

import numpy as np

abs(np.array((1,-2)))
array([1, 2])

abs([1,-1])
TypeError: bad operand type for abs(): 'list'

此外,像 sum 这样的内置函数也适用于 numpy 数组。我猜是因为 numpy 数组支持__getitem__?但是对于abs,如果它依赖于__getitem__,它也应该适用于列表,但它没有。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    这是因为numpy.ndarray 实现了__abs__(self) 方法。只需为您自己的班级提供它,abs() 就会神奇地工作。对于非内置类型,您还可以在事后提供此功能。例如

    class A:
        "A class without __abs__ defined"
        def __init__(self, v):
            self.v = v
    
    def A_abs(a):
        "An 'extension' method that will be added to `A`"
        return abs(a.v)
    
    # Make abs() work with an instance of A
    A.__abs__ = A_abs
    

    但是,这不适用于内置类型,例如 listdict

    【讨论】:

      【解决方案2】:

      abs 函数查找__abs__ 方法。

      您也可以像 numpy 一样,在您的类中实现 __abs__ 方法,以便 abs 可以与它​​们一起使用。

      class A(object):
          def __abs__(self):
              return 8
      
      >>> a= A()
      >>> abs(a)
      8
      >>>
      

      【讨论】:

        【解决方案3】:

        sum 适用于可迭代对象,例如列表或 numpy 数组。

        abs 适用于定义 __abs__ 方法的值,例如数字或 numpy.arrays:

        >>> x = -1
        >>> x.__abs__()
        1
        
        >>> class A(object):
        ...     def __abs__(self):
        ...         return 12
        >>> a = A()
        >>> abs(a)
        12
        

        lists 没有定义此方法,尽管您可以根据需要使用映射或列表推导(分别为 map(abs, [1, -1])[abs(x) for x in [1,-1]])。如果你喜欢矫枉过正,你也可以继承 list 并定义一个类似 numpy 的 __abs__ (但通常更可取的理解)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-01
          • 2022-01-26
          • 1970-01-01
          • 2013-12-07
          • 2013-08-24
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          相关资源
          最近更新 更多