2017-05-11 2 views
0


Ich habe eine Frage zu überschreiben Operanden. Ich habe gerade versucht, den Operator __add__(self, other) in einer benutzerdefinierten Klasse zu überschreiben, so dass eines seiner Elemente (ein numpy-Array) zu einem anderen numpy-Array hinzugefügt werden kann. Um beide Richtungen der Summierung möglich zu machen, habe ich sowohl den als auch den __radd__ Operator deklariert. Ein kleines Beispiel:Python-Klasse Summe mit numpy Array

import numpy as np 

class MyClass(): 
    def __init__(self, x): 
     self.x = x 
     self._mat = self._calc_mat() 


    def _calc_mat(self): 
     return np.eye(2)*self.x 

    def __add__(self, other): 
     return self._mat + other 

    def __radd__(self, other): 
     return self._mat + other 


def some_function(x): 
    return x + np.ones(4).reshape((2,2)) 

def some_other_function(x): 
    return np.ones(4).reshape((2,2)) + x 


inst = MyClass(3) 

some_function(x=inst) 
some_other_function(x=inst) 

Seltsamerweise bekomme ich zwei verschiedene Ausgänge. Der erste Ausgang von some_function ist wie erwartet:

Out[1] 
array([[ 4., 1.], 
     [ 1., 4.]]) 

Der zweite Ausgang gibt mir etwas Merkwürdiges:

Out[2]:  
array([[array([[ 4., 1.], 
     [ 1., 4.]]), 
     array([[ 4., 1.], 
     [ 1., 4.]])], 
     [array([[ 4., 1.], 
     [ 1., 4.]]), 
     array([[ 4., 1.], 
     [ 1., 4.]])]], dtype=object) 

Hat jemand eine Idee, warum das so ist?
Danke, Markus :-)

Antwort