首页 > 解决方案 > numpy 例程和 ndarray 方法之间的区别?

问题描述

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

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

从功能上讲,这些似乎与我相同;他们是吗?它们在编程上是否不同?(例如性能/内存方面)

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

标签: pythonnumpy

解决方案


首先要注意术语,所以这个例子的其余部分很清楚——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 上的那个)可能会使用“包装器工厂函数”,它实际上做同样的事情。另请参阅Q/A 以获取类似的示例np.transpose()。一般来说,它归结为np.<function>(arr)某种形式getattr(arr, <function>),至少对于fromnumeric.py.


就比较而言——你说的是使用顶级函数时会增加额外的开销,但这会带来一些额外的灵活性:例如,有一个对 的调用np.asanyarray(a),这意味着你可以传递一个 Python 列表至于a功能。在我的电脑上,调用np.asanyarray(arr)需要 1/8 的时间arr.any(),所以在答案中注入一点意见,在两者之间进行选择可能不是首先考虑性能优化的地方。


推荐阅读