numpy例程和ndarray方法之间的区别是什么?

3

在使用numpy时,通常可以选择从numpy API调用函数,或从ndarray调用函数,例如:

>>> import numpy as np
>>> array_ = np.array([True, False, True])
>>> np.any(array_)
True
>>> array_.any()
True

在功能上,它们对我来说看起来是相同的;它们是一样的吗?从程序角度来看有什么不同吗?(例如:性能/内存方面)

我尝试在 numpy 参考手册中寻找关于 ndarraysroutines 的答案,但据我所知没有给出任何解释。


如果你执行 some_array.foo,那么如果 foo 没有附加到 some_array 上,它将回退到 numpy.foo(array(some_array)) - Willem Van Onsem
1个回答

2

先讲术语以便于理解后面的示例--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,所以为了给出一些意见,选择两者之间可能不是性能优化的第一步。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接