2017-11-09 3 views
0

I einen Wrapper für Vereinfachungszwecke rund NumPy Array aufgebaut haben will ich nur den notwendigen Teil angezeigt werden, die Fehler zu zeigen:überlasteten eckige Klammern mit mehreren Parametern

class Matrix(object): 
    """wrap around numpy array 
    """ 

    def __init__(self, shape, fill_value): 
     self.matrix = np.full(shape, fill_value) 

    def __getitem__(self, a, b): 
     return self.matrix[a, b] 



m = Matrix((10, 10), 5) 
print(m[5, 5]) 

die Druckanweisung erzeugen folgende Fehler:

KeyError: __getitem__() takes exactly 3 arguments (2 given) 

was das fix ist m mit dem Operator [] wie die follwing zuzugreifen:

m[1, 1] 

Antwort

0

Die Lösung ist ein Tupel innerhalb einer Variablen wie folgt weitergeben:

class Matrix(object): 
    """wrap around numpy array 
    """ 

    def __init__(self, shape, fill_value): 
     self.matrix = np.full(shape, fill_value) 

    def __getitem__(self, a): 
     # we could do also do return self.matrix[a[0], a[1]] 
     return self.matrix[a] 


    m = Matrix((10, 10), 5) 
    print(m[5, 5]) 
1

Derzeit haben Sie eine Klasse Matrix mit einem Attribut matrix, die ein numpy Array ist. Daher müssen Sie das Attribut zuerst verweisen und dann die Indizes passieren:

>>> m.matrix[5,5] 
5 

An diesem Punkt haben Sie nicht um eine numpy Array gewickelt. Je nachdem, was Sie tun wollen, könnte dies ein Schritt in die richtige Richtung:

class Matrix(np.ndarray): 
    def __new__(cls, shape, fill_value=0): 
     return np.full(shape, fill_value) 

>>> m = MyMatrix((10, 10), 5) 
>>> print(m[5, 5]) 
>>> 5 

Dies ist jedoch im Wesentlichen tut nichts anderes, als m = np.full(shape, fill_value). Ich nehme an, dass Sie benutzerdefinierte Attribute und Methoden zu einem numpy-Array hinzufügen möchten, in dem Sie this example in der numpy Dokumentation auschecken sollten.