我一直认为 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'
我发现这令人困惑、不直观,而且我看不出背后有任何原因。不过,可能会有一个不错的;也许有人可以启发我。
最佳答案
当 numpy 作为 Numeric 的继承者被引入时,许多只是函数而不是方法的东西被作为方法添加到 ndarray
类型中。在这个特定的时间,能够对数组类型进行子类化是一项新功能。人们认为,使这些通用函数中的一些成为方法可以让子类更容易地做正确的事情。例如,将 .sum()
作为方法对于允许屏蔽数组类型忽略屏蔽值很有用;您可以编写适用于普通 ndarray
和掩码数组的通用代码,无需任何分支。
当然,你不能摆脱这些功能。这些函数的一个很好的特性是它们将接受任何可以强制转换为 ndarray
的对象,例如数字列表,它不会具有所有 ndarray
方法.并且作为方法添加的函数的具体列表不能包罗万象;这也不是好的 OO 设计。例如,无需将所有三角函数添加为方法。
当前的方法列表大多是在 numpy 开发的早期选择的,因为我们认为这些方法在子类化或符号方便方面会很有用。有了更多的经验,我们大多认为我们添加了太多的方法(说真的,没有必要让 .ptp()
成为一个方法)并且子类化 ndarray
通常是一个坏主意,原因我不会在这里详述。
因此,将方法列表作为可用函数列表的大部分子集,将 np.amin()
和 np.amax()
作为对 .min()
和 .max()
方法进行轻微重命名,以避免内置别名。
关于python - 为什么有些 numpy 调用没有作为方法实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23289642/