2017-01-05 16 views
4

의 하위 클래스에서 numpy ufuncs의 동작을 재정의하기 위해 __numpy_ufunc__() 설명 된 방법을 사용하려고하는데, 결코 호출되지 않는 것 같습니다. 이 유스 케이스가 가이드에 나열되어 있음에도 불구하고 실제로 __numpy_ufunc__()을 사용하는 사람의 사례는 찾을 수 없습니다. 아무도 이것을 시도 했습니까? 다음은 최소 예입니다.__numpy_ufunc __()의 사용

# Check python version 
import sys 
print(sys.version) 

3.5.1 | Continuum Analytics, Inc. | (기본 이세 (15) 2016 15시 32분 45초)

[GCC 4.4.7 20120313 (레드햇 4.4.7-1)

# Check numpy version 
import numpy as np 
print(np.__version__) 

1.11.2

# Subclass ndarray as discussed in 
# https://docs.scipy.org/doc/numpy/user/basics.subclassing.html 
class Function(np.ndarray): 

    # Create subclass object by view 
    def __new__(cls): 
     obj = np.asarray([1,2,3]).view(cls) 
     return obj 

    # I'm not even adding anything functionality yet 
    def __array_finalize(self,obj): pass 

    # Override ufuncs 
    def __numpy_ufunc__(ufunc, method, i, inputs, **kwargs): 
     print("In PF __numpy_ufunc__") 
     # do other stuff here if I want to 
     # and probably need to return a value... 

# Create two Functions 
f1=Function() 
f2=Function() 

# Check that they are correctly initialized as Function objects 
# not just ndarrays 
print(type(f1),type(f2)) 

& langle ; 클래스 '메인. 기능'& rangle; & nbsp; 클래스 '메인. 기능'& rangle;

# Add using operator 
f1+f2 

함수 ([2,4,6])

# Add, explicitly demanding a numpy ufunc 
np.add(f1,f2) 

함수 ([2, 4, 6]) 분명히

상기 서브 클래스의 작동은, 그것이 NumPy와를 이용한 것은 추가 배열 뒤에서. num3의 새 버전을 사용하여 __numpy_ufunc__() 기능을 사용하고 있습니다 (해당 docs 페이지에 따르면 v1.11의 새로운 기능). 그러나이 코드는 절대로 "In PF __numpy_ufunc__"을 출력하지 않습니다. 뭐라 구요?

+1

이상한 ... 설명서에 'self'인수가 나열되어 있거나 'staticmethod'또는 'classmethod'여야한다고합니다. – user2357112

+1

'ndarray'는 자체 __numpy_ufunc__를 가지고 있다고 생각하지 않습니다. 따라서'super'를 통해 호출하려고해서는 안됩니다. – user2357112

+0

@ user2357112 두 가지 모두에 동의합니다. 내가 그 문제를 muddling 그 문제를 원하지 않기 때문에 나는'슈퍼'라인을 제거합니다. –

답변

1

이 기능은 마침내 새 이름으로 Numpy 1.13에 출시되었습니다

__array_ufunc__이이 이름을 바꾼

을 추가 __numpy_ufunc__을 재 설계. NumPy의 ufunc의 동작을 재정의하기 위해 모든 클래스, ndarray 하위 클래스 또는이 클래스는이 메서드를 정의하거나 None으로 설정할 수 있습니다. 이것은 Python의 __mul__ 및 기타 이진 연산 루틴과 매우 유사하게 작동합니다. 이 새로운 옵션의 구현 및 동작에 대한 자세한 설명은 설명서를 참조하십시오. API는 잠정적이며, 피드백이있을 경우 수정 될 수 있으므로 하위 호환성을 보장하지는 않습니다. 자세한 내용은 NEP 및 설명서를 참조하십시오.

이렇게하면이 문제가 해결됩니다.