Tengo una clase (MyClass) con un atributo data que es un Numpy Array. Me gustaría permitir operaciones como:

myclass3 = myclass1 + myclass2   
myclass3 = myclass1 + Numpy.ndarray  
myclass3 = Numpy.ndarray + myclass1  

Donde todas estas operaciones agregan los datos juntos y devuelven una nueva MyClass. Entonces, los dos primeros son fáciles de usar definiendo agregar (). Pero para el último caso, no se comportó como esperaba que el ndarray pase el elemento uno por uno de suma con myclass1.data.

Esto es lo que quiero decir.

import numpy as np
class MyClass:
    def __init__(self, data):
        self.data = data

    def __add__(self, other):
        print(other)
        if isinstance(other, MyClass):
            data = self.data + other.data
        else:
            data = self.data + other
        return MyClass(data)

    def __radd__(self, other):
        print(other)
        data = self.data + other
        return MyClass(data)

myclass1 = MyClass(np.arange(5))
myclass2 = MyClass(np.ones(5)) 
nparray = np.arange(5) + 10
alist = [1, 1, 1, 1, 1]

En toda la combinación de adición, todos están bien incluso alist + myclass1, pero nparray + myclass1 devuelve:

In __radd__: 10
In __radd__: 11
In __radd__: 12
In __radd__: 13
In __radd__: 14

Lo que sucedió fue que cada elemento de la matriz Numpy se pasó a radd uno por uno en lugar de en su conjunto. Y regresa cinco veces, y obtuve el res como <class 'numpy.ndarray'> en lugar de MyClass objeto.

Entonces, ¿cómo puedo permitir la operación Numpy.ndarray + MyClass donde todo el ndarray pasará como otro en radd ().

Saludos cordiales, J

0
J_yang 26 sep. 2019 a las 18:47

1 respuesta

La mejor respuesta

Desafortunadamente, no hay nada que puedas hacer al respecto. alist + myclass1 falla, por lo que llama a su función __radd__, que funciona según lo previsto. Pero, en nparray + myclass1, numpy intenta evitar fallas mediante la transmisión. Entonces, hará el equivalente de

for value in nparray.data:
    value + myclass

Que fallará cada vez, y solo entonces se llamará a tu __radd__.

3
blue_note 26 sep. 2019 a las 15:53