使用numpy
时,通常可以选择从numpy
API调用函数与从ndarray
调用函数之间进行选择,例如:
>>> import numpy as np
>>> array_ = np.array([True, False, True])
>>> np.any(array_)
True
>>> array_.any()
True
从功能上看,这些与我完全相同; 是吗 它们在程序上是否不同? (例如性能/内存方面的信息)
答案 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,因此要在回答中注入一点观点,在这两者之间进行选择可能不是看待术语的第一位。性能优化。