numpy:源代码中的循环定义

时间:2014-11-12 12:14:15

标签: python numpy circular-reference

我去查找np.transposesource)的来源,定义似乎是圆形的?

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


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

2 个答案:

答案 0 :(得分:3)

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

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

这有点超出我的专业领域,但看起来ndarray是在numpy代码的C部分中定义的,所以这就是你找到它背后的实际逻辑的地方

答案 1 :(得分:0)

以下是_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