Frage

Ich suche eine 2D-Matrix von ganzen Zahlen mit symmetrisch zu schaffen Adressierung (das heißt Matrix [2,3] und die Matrix [3,2] den gleichen Wert zurück) in Python. Die ganzen Zahlen haben Addition und Subtraktion auf sie getan, und für logische Vergleiche verwendet werden. Meine ursprüngliche Idee war, die Integer-Objekte vorne zu erstellen und versuchen, eine Liste von Listen mit einigem Python äquivalent von Zeigern zu füllen. Ich bin mir nicht sicher, wie es zu tun, wenn. Was ist der beste Weg, dies zu implementieren, und soll ich Listen oder eine andere Datenstruktur verwenden?

War es hilfreich?

Lösung

Ein einfacher und sauberer Weg ist, um nur ein Wörterbuch mit sortierten Tupel als Schlüssel zu verwenden. Die Tupel entspricht mit Matrix-Index. Außer Kraft setzen __getitem__ und __setitem__ auf das Wörterbuch zugreifen, indem Sie sortierten Tupel; hier ist ein Beispiel-Klasse:

class Matrix(dict):
    def __getitem__(self, index):
        return super(Matrix, self).__getitem__(tuple(sorted(index)))
    def __setitem__(self, index, value):
        return super(Matrix, self).__setitem__(tuple(sorted(index)), value)

Und dann es wie folgt verwendet werden:

>>> matrix = Matrix()
>>> matrix[2,3] = 1066
>>> print matrix
{(2, 3): 1066}
>>> matrix[2,3]
1066
>>> matrix[3,2]
1066
>>> matrix[1,1]
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "z.py", line 3, in __getitem__
    return super(Matrix, self).__getitem__(tuple(sorted(index)))
KeyError: (1, 1)

Andere Tipps

Golub und Van Loan des "Matrix Computations" Buch beschreibt ein gangbares Adressierungsschema:

Sie können die Daten in einen Vektor und den Zugang packen wie folgt, vorausgesetzt, i> = j:

a_ij = A.vec((j-1)n - j(j-1)/2 + i)    

Du bist wahrscheinlich besser dran mit einer vollen Platz numpy Matrix. Ja, es verschwendet die Hälfte der Speicher redundante Speichern von Werten, aber Ihre eigene symmetrische Matrix in Python Walzen wird durch das Speichern und Verarbeiten der ganzen Zahlen als Python-Objekte noch mehr Speicher und CPU verschwenden.

Sie müssen nur das untere Dreieck der Matrix speichern. Typischerweise wird dies mit einer n getan (n + 1) / 2 Länge Liste. Sie verlassen nun die __getitem__ -Methodenüberladung müssen, um zu interpretieren, was der Eintrag bedeutet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top