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

时间:2016-11-29 09:09:39

标签: python numpy

我学习numpy。但我有些疑惑让我困惑:

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

和:sum(a)给出相同的结果。 那么为什么内置函数可以支持从第三方库计算数据类型呢? min()和max()执行相同的操作。(当dim为1时)

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

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

1 个答案:

答案 0 :(得分:7)

所有第三方库类型必须执行,是实现预期的协议(有时也称为接口)。 sum() function documentation告诉您预期的内容:

  

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

min()max()表示类似的要求(返回可迭代中的最小项返回可迭代中的最大项)。< / p>

此处,iterablestandard types documentation中描述的协议。协议本身不是类型,它们只是预期以某种方式运行的方法的集合。 collections.abc module提供了几个可用于测试某些内容是否实现协议的对象:

>>> 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整数。)