By default, numpy distributes operations across arrays if it doesn't know the type of the other object. This works well in most cases. For example, the following behaves as expected.
np.arange(5) + 5 # = [5, 6, 7, 8, 9]
I would like to define a class that overrides the addition operator as illustrated in the code below.
class Example:
def __init__(self, value):
self.value = value
def __add__(self, other):
return other + self.value
def __radd__(self, other):
return other + self.value
It works well for scalar values. For example,
np.arange(5) + Example(5) # = [5, 6, 7, 8, 9]
However, it doesn't quite do what I want for vector values. For example,
np.arange(5) + Example(np.arange(5))
yields the output
array([array([0, 1, 2, 3, 4]), array([1, 2, 3, 4, 5]),
array([2, 3, 4, 5, 6]), array([3, 4, 5, 6, 7]),
array([4, 5, 6, 7, 8])], dtype=object)
because the __add__ operator of the preceding numpy array takes priority over the __radd__ operator that I have defined. Numpy's __add__ operator calls __radd__ for each element of the numpy array yielding an array of arrays. How can I avoid numpy distributing the operation? I would like to avoid subclassing numpy arrays.