2014-11-12 2 views
1

소스를 찾아 np.transpose (source)으로 보았는데 정의가 원형으로 보입니까? transpose(a)가하는 모든 다음 호출 a.transpose 경우numpy : 소스 코드의 순환 정의

def transpose(a, axes=None): 

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

는 어떻게 a.transpose를 찾아 볼 수 있습니까?


코드의 일부분이 변환을 수행하고 있습니까? 내가 보았던 또 다른 전치 함수를 추천했다.

답변

3

실제로 순환 참조가 아닙니다. a.transpose은 numpy로 정의 된 함수가 아니라 객체의 메서드에 대한 참조입니다. "a 개체에 이미 transpose 메서드가있는 경우에는 그대로두고, 그렇지 않은 경우 _wrapit을 사용하여 a 개체를 ndarray 개체에 래핑합니다."

ndarray 클래스에는 transpose 메서드가 있으므로 Python 개체를 해당 클래스로 강제 설정하면 개체에 메서드에 액세스 할 수 있습니다.

이것은 내 전문 분야 밖에 있지만, numpy 코드의 C 부분에 ndarray이 정의되어있는 것처럼 보일 것입니다. 그러면 그 뒤에 실제 로직을 찾을 수 있습니다.

+0

너무 다른'transpose' 방법 내 객체의 유형에 따라, NumPy와 주위에 떠가? –

+0

@ johnmangual,'''_wrapit'''는 다른 모든 것을 처리하기위한 것 같습니다. – wwii

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