为什么有些numpy调用没有作为方法实现?

时间:2014-04-25 09:47:20

标签: python numpy

我一直认为Python是一种高度面向对象的编程语言。最近,我一直在使用numpy,我开始想知道为什么有很多东西只作为函数实现,而不是作为numpy.array的方法(或者ndarray a)对象。

如果我们有一个给定的数组a = np.array([1, 2, 3]) np.sum(a) >>> 6 a.sum() >>> 6 ,你可以做

np.amax(a)
>>> 3
a.amax()
>>> AttributeError: 'numpy.ndarray' object has no attribute 'amax'

看起来很好但是有很多调用不能像以下那样工作:

{{1}}

我发现这令人困惑,不直观,我认为没有任何理由。不过,可能会有一个好的;也许有人可以启发我。

1 个答案:

答案 0 :(得分:12)

当numpy被引入作为Numeric的后继者时,许多只是函数而不是方法的东西被添加为ndarray类型的方法。在这个特定的时间,具有子类化数组类型的能力是一个新功能。人们认为,制作一些这些常用函数方法可以让子类更容易地做正确的事情。例如,使用.sum()作为方法可以使掩码数组类型忽略掩码值;你可以编写适用于普通ndarray和掩码数组的通用代码而不需要任何分支。

当然,你无法摆脱这些功能。这些函数的一个很好的特性是它们将接受任何可以强制转换为ndarray的对象,就像数字列表一样,它不会拥有所有ndarray方法。并且作为方法添加的特定功能列表可以是包罗万象的;这也不是优秀的OO设计。例如,不需要将所有trig函数添加为方法。

当前的方法列表主要是在numpy的开发中早期选择的,我们认为这些方法在子类化或符号方便方面是有用的。凭借我们的经验,我们大多认为我们添加了太多方法(严重的是,.ptp()不需要成为方法)并且子类ndarray是由于我不会进入这里的原因,这通常是一个坏主意。

因此,将方法列表主要作为可用函数列表的子集,np.amin()np.amax()作为.min()和{{1}的轻微重命名避免别名内置函数的方法。