Python, wie multidimensionales Array mit einem String-Schlüssel wie ein Diktat indiziert wird

8

Ich würde gerne die Funktionalität von numpys array mit der von native python dict kombinieren, nämlich ein multidimensionales Array erstellen, das mit Strings indiziert werden kann.

Zum Beispiel könnte ich das tun:

%Vor%

Ich weiß, ich könnte dict_2d['a']['x'] machen, aber langfristig würde ich gerne in der Lage sein, sie wie numpige Arrays zu behandeln, einschließlich Matrixmultiplikation und so weiter, und das ist mit Layered-Dicts nicht möglich.

Es ist auch nicht so schwer, eine einfache Version der Klasse zu schreiben, wo ich einfach die Klasse benutze, um alle Strings in int-Indizes zu konvertieren und dann numpy zu verwenden, aber ich würde gerne etwas verwenden, das bereits existiert.

Edit: Ich brauche keine unglaubliche Leistung. Ich werde mit vielleicht 10x10 Arrays arbeiten. Mein Ziel ist es, den Code einfach und robust zu schreiben. Mit numpigen Arrays zu arbeiten ist nicht viel anders als nur in Fortran zu schreiben. Ich habe genug Zeit damit verbracht, Fortran-Indexierungsfehler ausfindig zu machen ...

    
ericksonla 12.05.2015, 18:39
quelle

3 Antworten

9

Sie suchen vielleicht nach Pandas , die nützliche Datentypen bieten, die numpy Arrays umschließen, so dass Sie stattdessen auf Zeilen und Spalten mit Namen zugreifen können von nur nach Nummer.

    
BrenBarn 12.05.2015, 19:42
quelle
2

Ich mag es nicht, fertige Antworten zu geben - aber ich denke, es würde viel mehr Zeit brauchen, es auf Englisch zu erklären -

Die Grundidee zum Abrufen von -Objekten besteht darin, die __getitem__ -Methode anzupassen - kommagetrennte Werte werden der Methode als Tupel präsentiert - Sie verwenden nur die Werte im Tupel als Indizes für Ihre verschachtelten Wörterbücher in der Reihenfolge.

Darüber hinaus hat es Python leicht gemacht, voll funktionsfähige dict equivalentes mit den collections.abc-Klassen zu erstellen: Wenn Sie eine minimale Menge von Methoden implementieren, wenn Sie collections[.abc].MutableMapping verwenden, wird das gesamte Wörterbuchverhalten emuliert - ( __getitem__, __setitem__, __delitem__, __iter__, __len__ ) - Then Es ist nur eine Frage der richtigen Iteration durch die Schlüsselkomponenten und neue, leere, regelmäßige Wörterbücher zu erstellen, um die benötigten Werte zu speichern.

%Vor%

Und du bist bereit zu gehen:

%Vor%

Bitte beachten Sie, dass dies eine High-Level-Implementierung ist, die einfach funktioniert, aber Sie werden mit der Optimierungsstufe, die Sie auf NumPy erhalten, nicht weit kommen - im Gegenteil. Wenn Sie in diesen Objekten schnelle Datenoperationen durchführen müssen, könnten Sie "cython" überprüfen - oder auf Ihre Idee zurückgreifen, die dict-Schlüssel auf nuemric-Schlüssel zu transponieren und NumPy zu verwenden (diese Idee könnte noch einige Ideen aus dieser Antwort auswählen) / p>     

jsbueno 12.05.2015 20:01
quelle
0

Benutze Pandas Sagen wir, die Datei ist so:

test.csv:

%Vor%

So können Sie in Python so etwas tun:

%Vor%     
Ishan Tomar 19.03.2017 18:06
quelle