为什么像abs这样的内置函数在numpy阵列上工作?

2024-04-20 12:33:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我很惊讶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__,那么它也应该适用于list,但它没有


Tags: importnumpy列表forastypenpabs
3条回答

abs函数查找__abs__方法。

您还可以像numpy一样,在类中实现__abs__方法,这样abs就可以与它们一起工作。

class A(object):
    def __abs__(self):
        return 8

>>> a= A()
>>> abs(a)
8
>>>

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

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)不起作用。

sum在iterable上工作,例如list或numpy数组。

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

>>> x = -1
>>> x.__abs__()
1

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

lists没有定义这个方法,尽管您可以使用map或list理解(map(abs, [1, -1])[abs(x) for x in [1,-1]])来满足您的需求。如果您喜欢overkill,您还可以将list子类化,并定义一个类似于__abs__的numpy(但是理解通常更好)

相关问题 更多 >