По умолчанию numpy распределяет операции по массивам, если он не знает тип другого объекта. В большинстве случаев это хорошо работает. Например, следующее поведение ведет себя так, как ожидалось.Избегайте numpy распределять операцию для перегруженного оператора
np.arange(5) + 5 # = [5, 6, 7, 8, 9]
Я хотел бы определить класс, который переопределяет оператор сложения, как показано в приведенном ниже коде.
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
Он хорошо работает для скалярных значений. Например,
np.arange(5) + Example(5) # = [5, 6, 7, 8, 9]
Однако, это не совсем то, что я хочу для векторных значений. Например,
np.arange(5) + Example(np.arange(5))
дает выходной сигнал
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)
потому что __add__
оператор предыдущего Numpy массива имеет приоритет над __radd__
оператора, который я определил. Оператор Numbox __add__
вызывает __radd__
для каждого элемента массива numpy, дающего массив массивов. Как я могу избежать numpy, распределяющего операцию? Я хотел бы избежать подклассификации массивов numpy.