为什么Python内置函数(例如sum()、max()、min())可以用于计算NumPy的数据类型ndarray?

5

我正在学习numpy,但我有一些困惑的问题:

>>> import numpy as np
>>> a = np.arange(10)
>>> a.sum()
45

而:sum(a) 给出了相同的结果。

那么为什么内置函数能够支持第三方库中数据类型的计算?min() 和 max() 也是如此(当dim为1时)。

我有两个猜测,我更喜欢后者:

  1. Python核心开发人员添加了对ndarray的支持;
  2. 在ndarray中定义了一些隐藏属性,使其成为可能。(如果是这样,它是什么?)
1个回答

7
所有第三方库类型需要做的就是实现期望的协议(有时也称为接口)。sum()函数文档告诉你期望什么:

从左到右求和start可迭代对象中的项目并返回总计。

min()max()也有类似的要求(返回可迭代对象中最小的元素返回可迭代对象中最大的元素)。
在此,可迭代对象是一个协议,在标准类型文档中进行了描述。协议本身不是类型,它们只是一组预期以某种方式运行的方法。 collections.abc模块提供了多个对象,您可以使用这些对象来测试某个对象是否实现了协议:
>>> import numpy as np
>>> from collections.abc import Iterable
>>> a = np.arange(10)
>>> isinstance(a, Iterable)
True

所以,ndarray类型是可迭代的,这就是sum()函数使用它来获取数组中包含的所有值并为您将这些值相加的原因。由于Python依赖协议,核心语言开发人员不必为每个第三方库添加支持。相反,库只需匹配核心语言的期望即可。请注意,ndarray.sum()的实现可以利用类型的内部实现;它可能可以更快地产生总和,因为它不必首先将内部数据转换为Python对象(迭代返回装箱类型,在这种情况下是Python int对象,而内部表示包含裸C整数)。

np.sum(a,...) 尝试运行 a.sum(...)。也就是说,它代表数组方法(如果存在)。这意味着 ndarray 子类可以添加自己的细节。 - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接