Wie definieren Sie einen zweidimensionalen array in Python
Möchte ich definieren eines zwei-dimensionalen Arrays, ohne eine Initiale Länge wie dieser:
Matrix = [][]
aber es funktioniert nicht...
Ich habe versucht den code unter, aber es ist falsch, zu:
Matrix = [5][5]
Fehler:
Traceback ...
IndexError: list index out of range
Was ist mein Fehler?
Man tut nicht zu definieren, arrays, oder eine andere Sache. Sie können jedoch erstellen von mehrdimensionalen Sequenzen, wie die Antworten hier zeigen. Denken Sie daran, dass python Variablen sind nicht typisiert, aber Werte sind stark typisiert.
IMHO, Die Frage ist gültig. Es verlangt einen spezifischen code, der funktioniert nicht; die Antworten, die mir erzählte, was ich wissen musste, um ein wichtiges, Beton, Programmierung Thema. Beachten Sie die Anzahl der upvotes, und sogar Lieblings-Marken. F. J ' s Antwort zeigte sogar eine Möglichkeit, dass die Initialisierung falsch gemacht, und warum es falsch ist. Alle sehr nützlich.
Ich bin verwirrt. Aus anderen Sprachen: es IST ein Unterschied zwischen einer 1D-Arrays, 1D-Arrays und 2D-Arrays. Und AFAIK gibt es keine Möglichkeit, dass eine multi-dimensionale-array (oder Liste) in python. Sollte hier gesagt werden...
IMHO, Die Frage ist gültig. Es verlangt einen spezifischen code, der funktioniert nicht; die Antworten, die mir erzählte, was ich wissen musste, um ein wichtiges, Beton, Programmierung Thema. Beachten Sie die Anzahl der upvotes, und sogar Lieblings-Marken. F. J ' s Antwort zeigte sogar eine Möglichkeit, dass die Initialisierung falsch gemacht, und warum es falsch ist. Alle sehr nützlich.
Ich bin verwirrt. Aus anderen Sprachen: es IST ein Unterschied zwischen einer 1D-Arrays, 1D-Arrays und 2D-Arrays. Und AFAIK gibt es keine Möglichkeit, dass eine multi-dimensionale-array (oder Liste) in python. Sollte hier gesagt werden...
InformationsquelleAutor Masoud Abasian | 2011-07-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist technisch versucht zu index ein nicht initialisiertes array. Müssen Sie Sie zunächst initialisieren der äußeren Liste mit Listen, bevor Sie das hinzufügen von Elementen; Python ruft diese
"list comprehension".
Können Sie nun hinzufügen von Elementen zu der Liste:
Zwar können Sie benennen wie Sie wollen, ich betrachte es auf diese Weise zu vermeiden, dass einige Verwirrung entstehen könnten, für die Indizierung, wenn Sie "x" für den inneren und den äußeren Listen, und möchte eine nicht-quadratische Matrix.
Seltsam Bearbeiten von ademar111190. In Python 3 gibt es keine xrange aber wenn Sie verwenden müssen Python 2 xrange ist die korrekte Funktion zu verwenden, wenn Sie nicht wollen, um unnötigerweise Objekte erstellen.
Wenn Sie nicht brauchen, es null-gefüllt, können
range
zu erstellen, die den internen Listen direkt:[range(5) for x in range(5)]
das ist wahr, aber Sie immer noch schaffen potenziell viele unnötige Objekt-Referenzen in Python 2 für die äußere iteration (versuchen, diese mit eine SEHR große Auswahl). Auch die Initialisierung auf einen Wert fast immer, was Sie will - und das ist mehr als oft nicht 0 ist. Bereich Erträge einer wiederholenden Auflistung - xrange gibt einen generator. Mein Punkt war, dass ademar "korrigiert" etwas, das tatsächlich mehr in der Regel richtig und effizienter als seine Korrektur.
die
[0] * w
Teil ist nett, aber[[0] * w] * h]
wird zu unerwarteten Verhalten. Versuchenmat = [[0] * 3] * 3; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 10, 0], [0, 10, 0]])
undmat = [[0] * 3 for i in range(3)]; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 0, 0], [0, 0, 0]])
.InformationsquelleAutor Manny D
Wenn Sie wirklich wollen, eine matrix, könnten Sie besser dran, mit
numpy
. Matrix-Operationen innumpy
am häufigsten verwenden ein array mit zwei Dimensionen. Es gibt viele Möglichkeiten zum erstellen eines neuen Arrays; eines der nützlichsten ist diezeros
Funktion, die einen shape-parameter und gibt ein array von der angegebenen Form, wobei die Werte mit null initialisiert:numpy
bietet einematrix
Art auch. Es ist weniger Häufig verwendet, und einige Leute empfehlen gegen es zu benutzen. Aber es ist nützlich für die Besuchernumpy
von Matlab, und in einigen anderen zusammenhängen. Ich dachte, ich würde es mit einschließen, da reden wir über Matrizen!Hier sind einige andere Möglichkeiten zum erstellen 2-d arrays und Matrizen (mit Ausgang entfernt, für Kompaktheit):
Für die numerische Matrizen, numpy ist König. Ich habe verwendet, der zwei-dimensionalen arrays von Generatoren, die ich entschied mich für die geschachtelte Verständnis der syntax.
Es gibt keine Notwendigkeit für die Umgestaltung; Sie können call
numpy.zeroes((5,5,...))
zum erstellen einer multi-dimensionalen Arrays.Ich bin damit einverstanden, dass numpy ist der Weg zu gehen für Matrizen in Python. Aber manchmal (zum Beispiel Hausaufgabe) kann man einfach nicht verwenden 🙁
Die Tatsache, dass die Frage, verwendet das englische Wort "matrix" bedeutet nicht, dass Sie verwenden sollten
np.matrix
zu vertreten. Die richtige Art und Weise zu vertreten, eine matrix, in numpy ist mit einemarray
.InformationsquelleAutor senderle
Hier ist eine kürzere Schreibweise für die Initialisierung einer Liste von Listen:
Leider Verkürzung dieser zu so etwas wie
5*[5*[0]]
funktioniert nicht wirklich, weil Sie am Ende mit 5 Exemplaren der gleichen Liste, also, wenn Sie ändern Sie alle verändern, zum Beispiel:Erklären Sie die Logik, die hinter der "Verkürzung" scheitern? Warum funktioniert die python-Ausgabe von Kopien der gleichen Liste in diesem Fall, und eine Reihe von verschiedenen Zellen im Fall von
[0]*5
?Ich habe 30 Minuten versucht herauszufinden, bevor ich erkannte, mein Fehler
Die obigen Kommentare sind nicht ganz richtig: [0]*5 noch schafft, eine Sequenz mit 5 mal eine Referenz auf das gleiche Objekt repräsentiert die Zahl 0. Aber Sie wird nie bemerken das, weil 0 ist unveränderlich (ich würde sagen 0 verhält sich wie eine Wert - oder Sie könnte es als ein primitiver Datentyp - weil es unveränderlich ist, so dass Sie nie Probleme mit Referenzen auf das selbe Objekt anstatt kopiert.)
mehr pythonic:
[[0]*5 for _ in range(5)]
mit anonymen Zählvariable, die Sie nicht verwendenInformationsquelleAutor Andrew Clark
Wenn Sie möchten, erstellen Sie eine leere matrix, die korrekte syntax ist
Und wenn Sie möchten, generieren Sie eine matrix der Größe 5 mit 0 aufgefüllt,
[][]
oder[[][]]
sondern[[]]
..Da die matrix vertreten ist, mit Python Liste(N) (die Zeilen) verschachtelt in einer anderen Liste (die Spalten).
Für Python-3 range-Funktion statt xrange func
InformationsquelleAutor mripard
Wenn alle Sie wollen, ist eine zwei-dimensionale Behälter zu halten einige Elemente könnten Sie bequem mit Hilfe eines Wörterbuchs statt:
Dann können Sie tun:
Dies funktioniert, weil
1,2
ist ein Tupel, und Sie verwenden es als Schlüssel, um index des Wörterbuchs. Das Ergebnis ist ähnlich wie eine dumme sparse matrix.Wie von osa und Josap Valls, können Sie auch
Matrix = collections.defaultdict(lambda:0)
so dass die fehlenden Elemente haben eine Standard-Wert von0
.Vatsal weitere Punkte, die für diese Methode ist wohl nicht sehr effizient für große Matrizen und sollte nur verwendet werden, in nicht performance-kritische code-Teile.
import collections; Matrix = collections.defaultdict(float)
zu ersetzen Nullen für nicht initialisierte Elemente.Würde nicht den Zugriff auf ein dict für Tupel(1,2) als Schlüssel für ein worst-case-Komplexität von O(n). Intern würde es hash-Tupel. In der Erwägung, dass mit einem 2D-array geben würde, O(1) Zeit, die Komplexität der access-index [1,2] - Zugriff . Also mit dict für das sollte nicht sein, gute Wahl.
href="https://wiki.python.org/moin/TimeComplexity" >wiki.python.org/moin/TimeComplexity sagt, dass der Durchschnittliche Fall ist O(1), aber du hast Recht, über den schlimmsten Fall. Sowieso, es sei denn, Sie reden über EINE MENGE VON ELEMENTEN, die Sie würde nicht interessieren, über diesen Unterschied. Als eine Angelegenheit von der Tat, würde ich besorgt sein, mehr über das Gedächtnis als die Zugriffszeit.
Auch wir versuchen immer zu vermeiden, die Verwendung von dicts, bis die gesamte Komplexität des Algorithmus ist gleich oder größer als O(n^2). Als n-mal O(n) Zugriffe geben, ein O(n^2) Komplexität.
Sorry, aber ich bin nicht einverstanden. Asymptotische Analyse immer geben wird O(n^2) , wenn ein worst-case O(n) Zugriff erfolgt 'n' Zeiten. Wo, wie Amortisierten Analyse kann eine geringere gebunden. Und es gibt einen riesigen Unterschied zwischen fortgeführten und durchschnittlichen Fall ... bitte, bevor Sie irgendwelche Annahmen und vage Kommentare
InformationsquelleAutor enobayram
In Python erstellen Sie eine Liste von Listen. Sie müssen nicht zu erklären, dass die Dimensionen vor der Zeit, aber Sie können. Zum Beispiel:
Nun die matrix[0][0] == 2 und die matrix[1][0] == 3. Sie können auch die list-comprehension-syntax. Dieses Beispiel verwendet es zweimal zu bauen, eine "zwei-dimensionale Liste":
extend
wäre auch hilfreich, im ersten Fall: Wenn Sie beginnen mitm = [[]]
, dann könnten Sie hinzufügen, um die innere Liste (erweitern einer Zeile) mitm[0].extend([1,2])
, und an der äußeren Liste (neue Zeile Anhängen) mitm.append([3,4])
diese Operationen lassen würde, Sie mit[[1, 2], [3, 4]]
.InformationsquelleAutor wberry
Die akzeptierte Antwort ist gut und richtig, aber es dauerte eine Weile, um zu verstehen, dass ich könnte es auch verwenden, um erstellen ein komplett leeres array.
Ergebnisse in
InformationsquelleAutor Fabian
Sollten Sie eine Liste von Listen, und der beste Weg ist die Verwendung von verschachtelten Verstehens:
Auf Ihre
[5][5]
Beispiel, erstellen Sie eine Liste mit einer ganzen Zahl "5" auf der Innenseite, und versuchen Sie, für den Zugriff auf 5. Element, und das wirft natürlich ein IndexError, weil es keine 5. Element:InformationsquelleAutor utdemir
Warum so ein langer code, das auch in
Python
Sie Fragen?Lange zurück, als ich war nicht wohl mit Python, sah ich die einzige Zeile, die Antworten für das schreiben von 2D-matrix-und sagte mir, ich werde nicht für die Verwendung von 2-D-matrix in Python wieder. (Die einzelnen Linien waren ziemlich gruselig und nicht mir irgendwelche Informationen auf, was Python zu tun war. Beachten Sie auch, dass ich bin mir nicht bewusst, diese Kürzel.)
Sowieso, hier ist der code für einen Anfänger, dessen kommen von C, CPP und Java-hintergrund
Hinweis auf Python-Liebhaber und-Experten: Bitte nicht nach unten Stimmen, nur weil ich schrieb einen ausführlichen code.
InformationsquelleAutor vardin
Deklarieren einer matrix aus Nullen (Einsen):
z.B.
bzw.
numpy.((x, y))
z.B.
Sogar drei Dimensionen möglich sind.
(http://www.astro.ufl.edu/~warner/prog/python.html siehe --> Multi-dimensionale arrays)
InformationsquelleAutor khaz
Eine Umschreibung für eine einfache Lesung:
InformationsquelleAutor Manohar Reddy Poreddy
Bin ich auf mein erstes Python-script, und ich war ein wenig verwirrt von der square matrix Beispiel so ich hoffe, das folgende Beispiel wird Ihnen helfen, etwas Zeit sparen:
so, dass
InformationsquelleAutor user110954
Verwenden:
*5 für die erste dimension funktioniert, da auf dieser Ebene der Daten ist unveränderlich.
matrix = [[0]*cols for _ in range(rows)]
InformationsquelleAutor innov8
Mithilfe von NumPy kann man initialisieren leere matrix wie diese:
Und später fügen Sie die Daten so:
InformationsquelleAutor Namrata Tolani
Lese ich in kommagetrennte Dateien wie dieses:
In der Liste "Daten" ist dann eine Liste von Listen mit index-Daten[row][col]
InformationsquelleAutor wsanders
Dies ist, wie ich in der Regel erstellen Sie 2D-arrays in python.
Ich finde diese syntax leicht zu merken im Vergleich zu zu for-Schleifen in einer Liste erfassen.
InformationsquelleAutor Michael
Wenn Sie wollen in der Lage sein, zu denken, es als 2D-array anstatt gezwungen zu denken, dass ein Begriff aus einer Liste von Listen (viel natürlicher aus meiner Meinung nach), können Sie Folgendes tun:
Das Ergebnis ist eine Liste (nicht ein NumPy-array), und überschreiben Sie die einzelnen Positionen mit zahlen, strings, was auch immer.
numpy.matrix
entsprichtnumpy.zeros
ohne Nullen, ohne Liste?InformationsquelleAutor alessadnro
Das ist, was Wörterbuch geschaffen!
Können Sie festlegen, Schlüssel und Werte zwei Möglichkeiten:
oder
Ergebnis:
InformationsquelleAutor KouchakYazdi
Verwenden:
Ich denke, NumPy ist der Weg zu gehen. Die oben ist eine Allgemeine, wenn Sie nicht verwenden möchten NumPy.
InformationsquelleAutor pterodragon
Vorsichtig sein, über diese kurze Ausdruck, siehe ausführliche Erläuterung unten bei @F. J ' s Antwort
Matrix[0], Matrix[1], ..., Matrix[4]
alle auf das gleiche array, also nachMatrix[0][0] = 3
, die Sie erwarten würdenMatrix[0][0] == Matrix[1][0] == ... == Matrix[4][0] == 3
.Dank gongzhitaao für Ihren Kommentar. Hatte ich es gelesen elier es würde gespeichert haben mich mindestens eine halbe Stunde.. Mit einer matrix, wo jede Zeile, die Punkte an der gleichen Stelle im Speicher scheint nicht sehr nützlich zu sein, und wenn Sie nicht wissen, was Sie tun, es ist sogar gefährlich! Ich bin mir ziemlich sicher, das ist NICHT das, was Masoud Abasian, wer die Frage gestellt hat, zu tun haben möchte.
Sie sollten diese entfernen zu beantworten, da es keine richtige Antwort. Anfänger könnten verwechselt werden.
Welche Antwort beziehen Sie sich? Ich sehe nicht ein Benutzer mit dem Namen "F. J" (auch nicht in gelöschte Antworten).
InformationsquelleAutor 和風信使
Wenn Sie nicht über die Größe Informationen, bevor Sie beginnen, erstellen Sie dann zwei eindimensionale Listen.
Liste 1: Zum speichern von Zeilen
Liste 2: Tatsächliche zwei-dimensionale matrix
Speichern Sie die gesamte Zeile in der 1. Liste. Ist das erledigt, fügen Sie Liste 1 in Liste 2:
Ausgabe:
InformationsquelleAutor Nagendra Nigade
durch die Verwendung Liste :
mithilfe von dict:
Sie können auch speichern Sie diese info in der hash-Tabelle für die schnelle Suche wie
matrix['1'] geben Sie das Ergebnis in O(1) Zeit
*nb: Sie müssen sich mit einer Kollision in der hash-Tabelle
InformationsquelleAutor Saurabh Chandra Patel
Wird schneller sein als:
[[0]*(L) for i in range(W)]
sollte[[0]*(L) for _ in range(W)]
seiti
ist nicht überall verwendetInformationsquelleAutor Harsh Sharma
Versuchen Sie dies:
InformationsquelleAutor Ankit Sharma
Im Falle dass, wenn Sie brauchen eine matrix mit vordefinierten Nummern können Sie verwenden Sie den folgenden code:
InformationsquelleAutor Vlad Bezden