Mehrdimensionales Array in Python

8

Ich habe ein kleines Java-Problem, das ich in Python übersetzen möchte. Dazu brauche ich ein mehrdimensionales Array. In Java sieht es so aus:

%Vor%

Weitere Werte werden bei Schleifen erzeugt und in das Array geschrieben.

Wie instanziiere ich das Array?

PS: Es gibt keine Matrixmultiplikation ...

    
Christian Stade-Schuldt 03.02.2009, 19:54
quelle

12 Antworten

11

Sie können es mit verschachtelten Listen erstellen:

%Vor%

Wenn es dynamisch sein muss, ist es komplizierter, warum schreibst du nicht selbst eine kleine Klasse?

%Vor%

Dies kann wie folgt verwendet werden:

%Vor%

Ich bin mir sicher, dass man es viel effizienter umsetzen könnte. :)

Wenn Sie mehrdimensionale Arrays benötigen, können Sie entweder ein Array erstellen und den Offset berechnen, oder Sie verwenden Arrays in Arrays in Arrays, was für den Speicher ziemlich schlecht sein kann. (Könnte aber schneller sein ...) Ich habe die erste Idee so umgesetzt:

%Vor%

Kann wie folgt verwendet werden:

%Vor%     
Georg Schölly 03.02.2009, 19:59
quelle
18

Wenn Sie sich auf die Python-Standardbibliothek beschränken, ist eine Liste von Listen das nächstliegende Konstrukt:

%Vor%

ergibt ein 2d-ähnliches Array. Auf die Zeilen kann als arr[i] für i in {0,..,len(arr} zugegriffen werden, der Zugriff auf Spalten ist jedoch schwierig.

Wenn Sie eine Bibliotheksabhängigkeit hinzufügen möchten, ist das Paket NumPy genau das, was Sie wirklich wollen. Sie können ein Array fester Länge aus einer Liste von Listen erstellen, indem Sie Folgendes verwenden:

%Vor%

Der Spaltenzugriff ist derselbe wie für die Listenliste, aber der Spaltenzugriff ist einfach: arr[:,i] für i in {0,..,arr.shape[1]} (die Anzahl der Spalten).

Tatsächlich können NumPy-Arrays n-dimensional sein.

Leere Arrays können mit

erstellt werden %Vor%

wobei shape ein Tupel der Größe in jeder Dimension ist; shape=(1,3,2) gibt ein 3-dimensionales Array mit der Größe 1 in der ersten Dimension, Größe 3 in der zweiten Dimension und 2 in der dritten Dimension an.

Wenn Sie Objekte in einem NumPy-Array speichern möchten, können Sie das auch tun:

%Vor%

Weitere Informationen zum NumPy-Projekt finden Sie auf der NumPy-Startseite .

    
Barry Wark 04.11.2008 06:37
quelle
13

Um ein Standard-Python-Array von Arrays beliebiger Größe zu erstellen:

%Vor%

Es wird so zugegriffen:

%Vor%

Ein kleiner Python, der erwähnenswert ist: Es ist verlockend, einfach

einzugeben %Vor%

, aber das kopiert das selbe Spaltenarray in jede Zeile, was zu unerwünschtem Verhalten führt. Nämlich:

%Vor%     
Deestan 04.11.2008 09:34
quelle
11

Sehen Sie sich numpy

an

Hier ist ein Code-Snippet für dich

%Vor%

Ich glaube nicht, dass Sie eine wissenschaftliche Anwendung implementieren müssen, um die Verwendung von numpy zu rechtfertigen. Es ist schneller und flexibler und Sie können so ziemlich alles speichern. Angesichts der Tatsache, dass ich denke, es ist wahrscheinlich besser zu versuchen und rechtfertigen nicht mit ihm. Es gibt legitime Gründe, aber es fügt viel hinzu und kostet sehr wenig, also verdient es Betrachtung.

P.S. Sind Ihre Array-Längen richtig? Es sieht wie eine ziemlich eigenartig geformte Matrix aus ...

    
Simon 03.02.2009 20:00
quelle
10

Mehrdimensionale Arrays sind ein wenig trübe. Es gibt nur wenige Gründe, sie zu verwenden, und viele Gründe, zweimal darüber nachzudenken und etwas anderes zu verwenden, das besser widerspiegelt, was Sie tun. [Hinweis. Deine Frage war zu wenig Kontext ;-)]

Wenn Sie Matrixmathematik verwenden, verwenden Sie numpy .

Allerdings haben einige Leute mit Sprachen gearbeitet, die sie dazu zwingen, mehrdimensionale Arrays zu verwenden, weil sie alles haben, was sie haben. Wenn Sie so alt sind wie ich (ich habe in den 70er Jahren angefangen zu programmieren), dann erinnern Sie sich vielleicht an die Tage, an denen mehrdimensionale Arrays die einzige Datenstruktur waren, die Sie hatten. Oder Ihre Erfahrung hat Sie möglicherweise auf Sprachen beschränkt, in denen Sie Ihr Problem in mehrdimensionale Arrays verwandeln mussten.

Angenommen, Sie haben eine Sammlung n 3D-Punkte. Jeder Punkt hat einen x-, y-, z- und Zeitwert. Ist das ein n x 4 Array? Oder ein 4 * n Array? Nicht wirklich.

Da jeder Punkt 4 feste Werte hat, ist dies genauer eine Liste von Tupeln.

%Vor%

Besser noch, wir könnten dies als eine Liste von Objekten darstellen.

%Vor%     
S.Lott 04.11.2008 12:04
quelle
5

Wenn Sie sparsame Arrays verwenden, können Sie ein dict verwenden, um Ihre Werte zu speichern. Pythons Diktate erlauben es, Tupel als Schlüssel zu verwenden, so dass Sie Elementen des "Sparse-Arrays" (was hier wirklich ein Diktat ist) zuweisen und darauf zugreifen können:

%Vor%     
paprika 03.02.2009 20:04
quelle
4

Wahrscheinlich nicht relevant für Sie, aber wenn Sie ernsthafte Matrix-Arbeit tun, sehen Sie numpy

    
Martin Beckett 03.02.2009 20:00
quelle
3

Für numerische Daten Numpy Arrays :

%Vor%

Für allgemeine Daten (z. B. Strings) können Sie eine Liste mit Listen, Tupellisten, ...

verwenden %Vor%     
gimel 04.11.2008 05:47
quelle
2

Hier können Sie schnell eine verschachtelte 3-dimensionale Liste erstellen, die mit Nullen initialisiert wurde:

%Vor%

Dies ist eine Liste von Listen, die etwas flexibler als ein Array sind. Sie können Folgendes tun:

%Vor%

um eine ganze Zeile im Array zu ersetzen, oder sie sogar so zu missbrauchen:

%Vor%

Aber wenn Sie Leistung brauchen, dann stimme ich zu, dass numpy der Weg ist.

Achtet auch auf:

%Vor%

Wenn Sie a[0][0][0]=7 auf dem Objekt oben versuchen, werden Sie sehen, was damit nicht stimmt.

    
Rafał Dowgird 03.02.2009 21:34
quelle
0

Eine andere Möglichkeit ist ein Wörterbuch:

%Vor%

Sie müssen den oberen & amp; untere Grenzen auch.

    
Matthew Trevor 05.11.2008 07:33
quelle
0

Ich bin gerade auf ein ähnliches Bedürfnis gestoßen und habe folgendes geschrieben:

%Vor%

Ich schaue nicht auf Geschwindigkeit, nur auf Funktionalität;)

Ich möchte eine Matrix mit N Dimensionen erstellen und initialisieren mit 0 (eine elem_count Anzahl der Elemente in jeder Dimension).

Hoffe, es hilft jemandem

    
fabiopedrosa 28.07.2009 15:31
quelle
0

Einfach, wenn Sie numpy verwenden:

%Vor%

'Einsen' können durch 'Nullen' ersetzt werden

    
HenryJP 29.09.2009 19:29
quelle

Tags und Links