我感到惊讶的是,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,但它不起作用。
发布于 2014-01-06 15:23:44
这是因为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 ),这是行不通的。
发布于 2014-01-06 15:25:14
abs函数查找__abs__方法。
您也可以像numpy一样在类中实现__abs__方法,这样abs就可以与它们一起工作。
即
class A(object):
def __abs__(self):
return 8
>>> a= A()
>>> abs(a)
8
>>>发布于 2014-01-06 15:26:23
sum工作在可迭代项上,例如列表或numpy数组。
abs适用于定义__abs__方法的值,例如数字或numpy.arrays:
>>> x = -1
>>> x.__abs__()
1
>>> class A(object):
... def __abs__(self):
... return 12
>>> a = A()
>>> abs(a)
12list不定义此方法,尽管您可以使用地图或列表理解(分别为map(abs, [1, -1])和[abs(x) for x in [1,-1]] )来满足您的需求。如果您喜欢过高,您也可以子类列表和定义一个类似于numpy的__abs__ (但是理解通常更好)。
https://stackoverflow.com/questions/20953127
复制相似问题