先讲术语以便于理解后面的示例--np.any(arr)
是一个函数; arr.any()
在技术上是一个实例方法。
通常,顶层的np.<function>(arr)
函数包装了arr
的方法。
下面是np.any()
的源代码,来自NumPy版本1.14.5,位于numpy.core.fromnumeric
:
def any(a, axis=None, out=None, keepdims=np._NoValue):
arr = asanyarray(a)
kwargs = {}
if keepdims is not np._NoValue:
kwargs['keepdims'] = keepdims
return arr.any(axis=axis, out=out, **kwargs)
NumPy的其他版本(例如目前在GitHub上的这个版本)可能使用一个“包装工厂函数”,它们实际上做的事情是几乎相同的。另请参见此处有关np.transpose()
的类似示例的问答。一般来说,np.<function>(arr)
会变成某种形式的getattr(arr, <function>)
,至少对于fromnumeric.py
中的内容是如此。
就比较而言,当使用顶层函数时,增加的额外开销很小,但是这也带来了一些灵活性:例如,调用了np.asanyarray(a)
,这意味着您可以将Python列表作为a
传递给函数。在我的电脑上,调用np.asanyarray(arr)
的时间只有arr.any()
的1/8,所以为了给出一些意见,选择两者之间可能不是性能优化的第一步。
some_array.foo
,那么如果foo
没有附加到some_array
上,它将回退到numpy.foo(array(some_array))
。 - Willem Van Onsem