我一直认为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}}
我发现这令人困惑,不直观,我认为没有任何理由。不过,可能会有一个好的;也许有人可以启发我。
答案 0 :(得分:12)
当numpy被引入作为Numeric的后继者时,许多只是函数而不是方法的东西被添加为ndarray
类型的方法。在这个特定的时间,具有子类化数组类型的能力是一个新功能。人们认为,制作一些这些常用函数方法可以让子类更容易地做正确的事情。例如,使用.sum()
作为方法可以使掩码数组类型忽略掩码值;你可以编写适用于普通ndarray
和掩码数组的通用代码而不需要任何分支。
当然,你无法摆脱这些功能。这些函数的一个很好的特性是它们将接受任何可以强制转换为ndarray
的对象,就像数字列表一样,它不会拥有所有ndarray
方法。并且作为方法添加的特定功能列表可以是包罗万象的;这也不是优秀的OO设计。例如,不需要将所有trig函数添加为方法。
当前的方法列表主要是在numpy的开发中早期选择的,我们认为这些方法在子类化或符号方便方面是有用的。凭借我们的经验,我们大多认为我们添加了太多方法(严重的是,.ptp()
不需要成为方法)并且子类ndarray
是由于我不会进入这里的原因,这通常是一个坏主意。
因此,将方法列表主要作为可用函数列表的子集,np.amin()
和np.amax()
作为.min()
和{{1}的轻微重命名避免别名内置函数的方法。