我去查找np.transpose(source)的来源,定义似乎是圆形的?
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
?
代码的哪一部分正在进行转置?我所看到的只是转介到另一个转置函数。
答案 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