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
, inputs
및 kwargs
, 그래서 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)
작성할 수 있습니다.
비슷한 질문 (답변 없음) : https://stackoverflow.com/questions/47600049/can-binary-operator-methods-of-numpy-arrays-be-overridden-by-the-right-operand – hpaulj
아니, 그렇지 않아. 왼쪽 피연산자가 메서드를 구현하면 먼저이 메서드가 실행됩니다. – jonrsharpe
@jonrsharpe mb 'CustomArray'를 수정하여 numpy가 적절한 오류 메시지를 생성 할 수있는 방법이 있습니다. – DikobrAz