使用 numpy
时,通常可以选择从 numpy
API 调用函数,还是从 ndarray
调用函数,例如:
>>> import numpy as np
>>> array_ = np.array([True, False, True])
>>> np.any(array_)
True
>>> array_.any()
True
在功能上,这些对我来说似乎是相同的;
他们是吗?
它们在编程上是否不同? (例如性能/内存方面)
我试图在关于 ndarrays 的 numpy
引用手册中找到答案和 routines ,但据我所知,没有给出任何解释。
首先要注意术语,这样这个例子的其余部分就很清楚了-- 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”来做几乎相同的事情。另见 this与 np.transpose()
类似示例的问答.一般来说,它归结为 np.<function>(arr)
变成某种形式的 getattr(arr, <function>)
,至少对于 fromnumeric.py
中的内容.
就比较而言——您谈论的是使用顶级函数时增加的额外开销,但这带来了一些额外的灵 active :例如,调用了 np.asanyarray(a)
,这意味着您可以将 Python 列表作为 a
传递到功能。在我的电脑上,调用 np.asanyarray(arr)
花费 arr.any()
时间的 1/8 ,所以在答案中加入一点意见,在两者之间进行选择可能不是性能优化方面的首要考虑。