为什么python bulit-in函数如sum(),max(),min()可用于计算numpy的数据类型ndarray?

Fei*_*shi 5 python numpy

我正在学习numpy.但我有些疑惑让我困惑:

>>> import numpy as np
>>> a = np.arange(10)
>>> a.sum()
45
Run Code Online (Sandbox Code Playgroud)

并:sum(a)给出相同的结果.那么为什么内置函数可以支持从第三方库计算数据类型呢?min()和max()做同样的事情.(当昏暗是1时)

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

  1. python核心开发人员添加对ndarray的支持;
  2. 在ndarray中定义的一些隐藏属性会发生这种情况.(如果是这样,它是什么?)

Mar*_*ers 7

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

Sums 从左到右开始可迭代的项目并返回总数.

min()max()声明类似的要求(返回可迭代中的最小项,返回可迭代中的最大项).

这里,iterable是一种协议,在标准类型文档中描述.协议本身不是类型,它们只是预期以某种方式运行的方法的集合.该collections.abc模块提供了几个对象,您可以使用它们来测试某些实现协议的内容:

>>> import numpy as np
>>> from collections.abc import Iterable
>>> a = np.arange(10)
>>> isinstance(a, Iterable)
True
Run Code Online (Sandbox Code Playgroud)

所以ndarray类型是可迭代的,这就是sum()函数用于获取数组中包含的所有值的函数,为您总结这些值.

由于Python依赖于协议,因此核心语言开发人员不必为每个第三方库添加支持.相反,这些库只是符合核心语言的期望.

注意,ndarray.sum()实现可以使用该类型的内部实现; 它可能会更快地产生总和,因为它不必首先将内部数据转换为Python对象(迭代返回盒装类型,int在这种情况下为Python 对象,而内部表示包含裸C整数).