【问题标题】:numpy: circular definition in source codenumpy:源代码中的循环定义
【发布时间】:2014-11-12 12:14:14
【问题描述】:

我去查找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


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

【问题讨论】:

    标签: python numpy circular-reference


    【解决方案1】:

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

    由于ndarray 类有一个transpose 方法,强制Python 对象进入该类可以让对象访问该方法。

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

    【讨论】:

    • 所以还有其他 transpose 方法在 numpy 周围浮动,具体取决于我的对象的类型?
    • @johnmangual,好像_wrapit 是用来处理所有其他人的。
    【解决方案2】:

    这是_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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 2021-04-06
      • 1970-01-01
      相关资源
      最近更新 更多