我正在学习numpy,但我有一些困惑的问题:
>>> import numpy as np
>>> a = np.arange(10)
>>> a.sum()
45
而:sum(a)
给出了相同的结果。
那么为什么内置函数能够支持第三方库中数据类型的计算?min() 和 max() 也是如此(当dim为1时)。
我有两个猜测,我更喜欢后者:
- Python核心开发人员添加了对ndarray的支持;
- 在ndarray中定义了一些隐藏属性,使其成为可能。(如果是这样,它是什么?)
我正在学习numpy,但我有一些困惑的问题:
>>> import numpy as np
>>> a = np.arange(10)
>>> a.sum()
45
而:sum(a)
给出了相同的结果。
那么为什么内置函数能够支持第三方库中数据类型的计算?min() 和 max() 也是如此(当dim为1时)。
我有两个猜测,我更喜欢后者:
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