numpy:源代码中的循环定义



我去查找np.transpose(源)的源代码,定义似乎是循环的?

def transpose(a, axes=None):
    try:
        transpose = a.transpose
    except AttributeError:
        return _wrapit(a, 'transpose', axes)
    return transpose(axes)

如果transpose(a)所做的只是调用a.transpose那么我们如何查找a.transpose


代码的哪一部分在进行转置? 我所看到的只是对另一个转置函数的引用。

它实际上不是一个循环引用。 a.transpose是对对象方法的引用,而不是 numpy 定义的函数。它实际上是在说"如果对象a已经有一个transpose方法,那就别管它;否则,请使用_wrapit将对象a包装在ndarray对象中"。

由于ndarray类具有transpose方法,因此强制将 Python 对象放入该类可使对象访问该方法。

这有点超出我的专业领域,但似乎ndarray是在 numpy 代码的 C 部分中定义的,因此您将在那里找到它背后的实际逻辑。

这是_wrapit的代码:

File:       /usr/local/lib/python2.7/site-packages/numpy/core/fromnumeric.py
Definition: numpy.core.fromnumeric._wrapit(obj, method, *args, **kwds)
Source:
def _wrapit(obj, method, *args, **kwds):
    try:
        wrap = obj.__array_wrap__
    except AttributeError:
        wrap = None
    result = getattr(asarray(obj), method)(*args, **kwds)
    if wrap:
        if not isinstance(result, mu.ndarray):
            result = asarray(result)
        result = wrap(result)
    return result

最新更新