首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么像abs这样的内置函数可以在numpy数组上工作?

为什么像abs这样的内置函数可以在numpy数组上工作?
EN

Stack Overflow用户
提问于 2014-01-06 15:20:49
回答 3查看 9.1K关注 0票数 19

我感到惊讶的是,abs在numpy数组上工作,而不在列表上工作。为什么会这样呢?

代码语言:javascript
运行
复制
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,但它不起作用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-06 15:23:44

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

代码语言:javascript
运行
复制
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 ),这是行不通的。

票数 25
EN

Stack Overflow用户

发布于 2014-01-06 15:25:14

abs函数查找__abs__方法。

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

代码语言:javascript
运行
复制
class A(object):
    def __abs__(self):
        return 8

>>> a= A()
>>> abs(a)
8
>>>
票数 5
EN

Stack Overflow用户

发布于 2014-01-06 15:26:23

sum工作在可迭代项上,例如列表或numpy数组。

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

代码语言:javascript
运行
复制
>>> x = -1
>>> x.__abs__()
1

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

list不定义此方法,尽管您可以使用地图或列表理解(分别为map(abs, [1, -1])[abs(x) for x in [1,-1]] )来满足您的需求。如果您喜欢过高,您也可以子类列表和定义一个类似于numpy的__abs__ (但是理解通常更好)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20953127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档