我一直认为Python是一种高度面向对象的编程语言.最近,我一直在使用numpy
很多,我开始想知道为什么有很多东西只作为函数实现,而不是作为numpy.array
(或ndarray
)对象的方法.
a
例如,如果我们有一个给定的数组,你可以这样做
a = np.array([1, 2, 3])
np.sum(a)
>>> 6
a.sum()
>>> 6
Run Code Online (Sandbox Code Playgroud)
看起来很好,但有很多调用不能像以下一样工作:
np.amax(a)
>>> 3
a.amax()
>>> AttributeError: 'numpy.ndarray' object has no attribute 'amax'
Run Code Online (Sandbox Code Playgroud)
我发现这令人困惑,不直观,我认为没有任何理由.不过,可能会有一个好的; 也许有人可以开导我.
Rob*_*ern 12
当numpy被引入作为Numeric的后继者时,许多只是函数而不是方法的东西被添加为ndarray
类型的方法.在这个特定的时间,具有子类化数组类型的能力是一个新功能.人们认为,制作一些这些常用函数方法可以让子类更容易地做正确的事情.例如,使用.sum()
一种方法可以使掩码数组类型忽略掩码值; 您可以编写通用代码,这些代码既可用于普通数据,也可用于ndarray
屏蔽数组,无需任何分支.
当然,你无法摆脱这些功能.这些函数的一个很好的特性就是它们可以接受任何可以被强制转换成对象的对象ndarray
,就像一个数字列表一样,它不具备所有的ndarray
方法.并且作为方法添加的特定功能列表不能包含所有内容; 这也不是优秀的OO设计.例如,不需要将所有trig函数添加为方法.
目前的方法列表主要是在numpy开发的早期选择的,我们认为这些方法在子类化或符号方便方面是有用的.凭借我们的经验,我们大多认为我们添加了太多方法(严重的是,没有必要.ptp()
成为一种方法)而且子类化ndarray
通常是一个坏主意,因为我不会在这里讨论.
因此,采取的方法列表作为主要的可用功能,用列表的一个子集np.amin()
,并np.amax()
为轻微重命名为.min()
和.max()
方法来避免走样建宏.
归档时间: |
|
查看次数: |
1252 次 |
最近记录: |