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