2017-12-11 18 views
0

나는 numpy.ndarray과 비슷한 클래스 CustomArray입니다. 사람들이 __add__, __mul__ 등과 같은 산술 연산자를 오버로드합니다. 사람들이 numpy와 함께 사용할 가능성이 높기 때문에 때때로 numpy.ndarray 연산자가 CustomArray 대신 호출됩니다. 최악의 경우는 실제로 작업하여 원하지 않는 결과를 만들어내는 것입니다.파이썬이 운영자 호출을 방지합니다.

a = np.array([1, 2, 3]) 
b = CustomArray([1, 2, 3]) 
c = a + b # np.ndarray.__add__ will be called! 

방지 할 수있는 방법이 있습니까? 따라서 통역사는 오류를 제기하거나 항상 CustomArray 연산자 오버로드를 선호합니다.

+1

비슷한 질문 (답변 없음) : https://stackoverflow.com/questions/47600049/can-binary-operator-methods-of-numpy-arrays-be-overridden-by-the-right-operand – hpaulj

+0

아니, 그렇지 않아. 왼쪽 피연산자가 메서드를 구현하면 먼저이 메서드가 실행됩니다. – jonrsharpe

+0

@jonrsharpe mb 'CustomArray'를 수정하여 numpy가 적절한 오류 메시지를 생성 할 수있는 방법이 있습니다. – DikobrAz

답변

2

NumPy 1.13에는 새로운 __array_ufunc__ API이 있습니다. 이 API는 잠정이며 이전 버전과의 호환성은 아직 보장되지 않습니다.

numpy.ndarray 해당 연산자에 대해 NumPy ufuncs에 대리인을 지정하고 NumPy ufuncs는 __array_ufunc__에 위임하여 ufunc 동작을 구현합니다. 이 규칙은 numpy.ndarray.__array_ufunc__을 건너 뛰므로 자신의 __array_ufunc__을 구현하면 NumPy 배열에서 인스턴스를 사용할 때 항상 우선 순위가 적용됩니다. 당신이 그것을 구현하려는 경우, 서명이

def __array_ufunc__(self, ufunc, method, *inputs, **kwargs) 

어디,

class CustomArray(...): 
    __array_ufunc__ = None 

또는 : 당신이 당신의 개체에 대한 모든 ufuncs을 사용하지 않으려면

, 당신은 당신의 클래스에 __array_ufunc__ = None을 설정할 수 있습니다 관심이있는 경우에

  • ufunc은 ufunc 개체입니다 (for 예를 들어,
  • method
  • "__call__"입니다 +에 대한 numpy.add),
  • inputs는 튜플 (left operand, right operand)이며,
  • kwargs가 비어 있습니다. 당신이 그 사건을 처리하지 않으려면
고급 케이스에 대한

, method, inputskwargs, 그래서 return NotImplemented을 다를 수 있습니다. 당신이 NumPy와 배열로 + 과부하하려면

는 예를 들어, 당신은 또한 여전히 __add__를 구현해야합니다

def __array_ufunc__(self, ufunc, method, *inputs, **kwargs): 
    if ufunc is not numpy.add: 
     return NotImplemented 
    if method != "__call__": 
     return NotImplemented 
    if kwargs: 
     return NotImplemented 
    return my_addition_logic(*inputs) 

작성할 수 있습니다.

+0

어떤 이유로 든 작동하지 않을 수 있습니다. np.ndarray에서 하위 클래스로 만들 경우에만 작동합니까? – DikobrAz

+0

@DikobrAz : 아니요, 'numpy.ndarray'를 서브 클래 싱하는 것은 특별히 요구 사항이 아닙니다. – user2357112

+0

감사합니다! – DikobrAz