簡體   English   中英

為什么像abs這樣的內置函數適用於numpy數組?

[英]Why built-in functions like abs works on numpy array?

我感到驚訝的是, 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__它也適用於列表,但它沒有。

那是因為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

abs函數查找__abs__方法。

你也可以像numpy一樣在你的類中實現__abs__方法,這樣abs就適用於它們。

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

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

sum適用於iterables,例如list或numpy數組。

abs適用於定義__abs__方法的值,例如numbers或numpy.arrays:

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

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

list s沒有定義這個方法,雖然你可以使用map或list comprehensions( map(abs, [1, -1])[abs(x) for x in [1,-1]] )來滿足你的需要。 如果你喜歡矯枉過正,你也可以將列表子類化並定義類似numpy的__abs__ (但理解通常更可取)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM