NumPy 1.13には、新しい__array_ufunc__
APIがあります。このAPIは暫定であり、下位互換性は保証されていません。
numpy.ndarray
NumPy ufuncsを演算子に委譲し、NumPy ufuncsは__array_ufunc__
に委譲してufuncの動作を実装します。このルールはnumpy.ndarray.__array_ufunc__
をスキップするので、独自の__array_ufunc__
を実装する場合は、NumPy配列でインスタンスを使用するときは常に優先されます。
あなたは、オブジェクトのすべてのufuncsを無効にしたい場合は、あなたのクラスに__array_ufunc__ = None
を設定することができます。
class CustomArray(...):
__array_ufunc__ = None
をあなたはそれを実装したい場合は別の方法として、署名は
def __array_ufunc__(self, ufunc, method, *inputs, **kwargs)
です興味がある場合は、
ufunc
はufuncオブジェクトです(for +
たとえば、numpy.add
)、
method
は
inputs
タプル(left operand, right operand)
であり、
kwargs
が空である、"__call__"
あります。
より高度な例については
、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