[英]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
但是,這不適用於內置類型,例如list
或dict
。
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.