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

时间:2018-07-12 13:05:49

标签: python numpy

使用numpy时,通常可以选择从numpy API调用函数与从ndarray调用函数之间进行选择,例如:

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

从功能上看,这些与我完全相同; 是吗 它们在程序上是否不同? (例如性能/内存方面的信息)

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

1 个答案:

答案 0 :(得分: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(例如one currently on GitHub)可能会使用“ wrapper factory function”来实现几乎相同的功能。有关np.transpose()的类似示例,另请参见this Q / A。通常,归结为np.<function>(arr)变成getattr(arr, <function>)的某种形式,至少对于fromnumeric.py中的内容而言。


从比较的角度来看,您正在谈论使用顶级函数时增加的额外开销,但这带来了更多的灵活性:例如,有一个对np.asanyarray(a)的调用,这意味着您可以将Python列表作为a传递给该函数。在我的计算机上,对np.asanyarray(arr)的调用花费了arr.any()的时间的1/8,因此要在回答中注入一点观点,在这两者之间进行选择可能不是看待术语的第一位。性能优化。