Ich möchte ein zweidimensionales Array ohne eine initialisierte Länge wie folgt definieren:
Matrix = [][]
aber es funktioniert nicht...
Ich habe den folgenden Code ausprobiert, aber er ist auch falsch:
Matrix = [5][5]
Error:
Traceback ...
IndexError: list index out of range
Was ist mein Fehler?
python
matrix
syntax-error
Masoud Abasian
quelle
quelle
Antworten:
Sie versuchen technisch, ein nicht initialisiertes Array zu indizieren. Sie müssen zuerst die äußere Liste mit Listen initialisieren, bevor Sie Elemente hinzufügen. Python nennt dies "Listenverständnis".
Sie können der Liste jetzt Elemente hinzufügen:
Beachten Sie, dass die Matrix "y" -Adresse major ist, mit anderen Worten, der "y-Index" steht vor dem "x-Index".
Obwohl Sie sie nach Ihren Wünschen benennen können, sehe ich das so, um Verwirrung zu vermeiden, die bei der Indizierung auftreten kann, wenn Sie "x" sowohl für die innere als auch für die äußere Liste verwenden und eine nicht quadratische Matrix wünschen.
quelle
range
die internen Listen direkt erstellen:[range(5) for x in range(5)]
[0] * w
Teil ist nett, wird aber[[0] * w] * h]
unerwartetes Verhalten erzeugen. Versuchen Siemat = [[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]])
.Wenn Sie wirklich eine Matrix wollen, ist es möglicherweise besser, sie zu verwenden
numpy
. Matrixoperationen verwendennumpy
meistens einen Array-Typ mit zwei Dimensionen. Es gibt viele Möglichkeiten, ein neues Array zu erstellen. Eine der nützlichstenzeros
Funktionen ist die Funktion, die einen Formparameter verwendet und ein Array der angegebenen Form mit den auf Null initialisierten Werten zurückgibt:Hier sind einige andere Möglichkeiten, um 2D-Arrays und Matrizen zu erstellen (wobei die Ausgabe aus Gründen der Kompaktheit entfernt wurde):
numpy
stellt auch einenmatrix
Typ zur Verfügung, wird jedoch für keine Verwendung mehr empfohlen und kann in Zukunft entfernt werden.numpy
quelle
np.matrix
. Die richtige Art, eine Matrix in Numpy darzustellen, ist mit einemarray
.array
s anstelle von Matrizen aus. Obwohl dies nicht immer empfohlen wird, gibt es legitime Gründe für die Verwendungmatrix
- Kontextfragen.matrix
? Seit@
Einführung des Operators scheint es einen Grund weniger zu geben, seit dieser Beitrag geschrieben wurde.numpy
Dokumente zeigen jetzt an, dass die Klasse in Zukunft möglicherweise veraltet und entfernt wird, also habe ich sie aus der Antwort herausgenommen.Hier ist eine kürzere Notation zum Initialisieren einer Liste von Listen:
Leider
5*[5*[0]]
funktioniert es nicht wirklich, dies auf so etwas wie zu kürzen, da Sie am Ende 5 Kopien derselben Liste haben. Wenn Sie also eine davon ändern, ändern sich alle, zum Beispiel:quelle
[0]*5
?[[0]*5 for _ in range(5)]
mit anonymem Schleifenzähler, den Sie nicht verwenden[0]*5
funktioniert. Jetzt verstehe ich, warum[{0}]*8
das auch eine schlechte Idee wäre.Wenn Sie eine leere Matrix erstellen möchten, lautet die korrekte Syntax
Und wenn Sie eine Matrix der Größe 5 erzeugen möchten, die mit 0 gefüllt ist,
quelle
Wenn Sie nur einen zweidimensionalen Container für einige Elemente benötigen, können Sie stattdessen bequem ein Wörterbuch verwenden:
Dann können Sie tun:
Dies funktioniert, weil
1,2
es sich um ein Tupel handelt und Sie es als Schlüssel zum Indizieren des Wörterbuchs verwenden. Das Ergebnis ähnelt einer dummen, spärlichen Matrix.Wie von osa und Josap Valls angegeben, können Sie auch verwenden,
Matrix = collections.defaultdict(lambda:0)
damit die fehlenden Elemente den Standardwert von haben0
.Vatsal weist ferner darauf hin, dass diese Methode für große Matrizen wahrscheinlich nicht sehr effizient ist und nur in nicht leistungskritischen Teilen des Codes verwendet werden sollte.
quelle
import collections; Matrix = collections.defaultdict(float)
initialisierte Elemente durch Nullen ersetzen.In Python erstellen Sie eine Liste von Listen. Sie müssen die Dimensionen nicht im Voraus deklarieren, können dies aber. Zum Beispiel:
Jetzt Matrix [0] [0] == 2 und Matrix [1] [0] == 3. Sie können auch die Syntax des Listenverständnisses verwenden. In diesem Beispiel wird es zweimal verwendet, um eine "zweidimensionale Liste" zu erstellen:
quelle
extend
Dies wäre auch im ersten Fall hilfreich: Wenn Sie mit beginnenm = [[]]
, können Sie der inneren Liste hinzufügen (eine Zeile erweitern) mitm[0].extend([1,2])
und der äußeren Liste hinzufügen (eine neue Zeile anhängen)m.append([3,4])
, und diese Operationen würden Sie verlassen[[1, 2], [3, 4]]
.Die akzeptierte Antwort ist gut und richtig, aber ich habe eine Weile gebraucht, um zu verstehen, dass ich damit auch ein vollständig leeres Array erstellen kann.
führt zu
quelle
Sie sollten eine Liste mit Listen erstellen. Der beste Weg ist, verschachtelte Verständnisse zu verwenden:
In Ihrem
[5][5]
Beispiel erstellen Sie eine Liste mit einer Ganzzahl "5" und versuchen, auf das fünfte Element zuzugreifen. Dadurch wird natürlich ein IndexError ausgelöst, da kein fünftes Element vorhanden ist:quelle
Warum so ein langer Code, den
Python
Sie auch fragen?Vor langer Zeit, als ich mit Python nicht vertraut war, sah ich die einzeiligen Antworten zum Schreiben einer 2D-Matrix und sagte mir, dass ich in Python keine 2-D-Matrix mehr verwenden werde. (Diese einzelnen Zeilen waren ziemlich beängstigend und gaben mir keine Informationen darüber, was Python tat. Beachten Sie auch, dass mir diese Abkürzungen nicht bekannt sind.)
Hier ist der Code für Anfänger mit C-, CPP- und Java-Hintergrund
Hinweis für Python-Liebhaber und Experten: Bitte stimmen Sie nicht ab, nur weil ich einen detaillierten Code geschrieben habe.
quelle
Ein Umschreiben zum einfachen Lesen:
quelle
Verwenden:
Die * 5 für die erste Dimension funktioniert, da auf dieser Ebene die Daten unveränderlich sind.
quelle
matrix = [[0]*cols for _ in range(rows)]
So deklarieren Sie eine Matrix von Nullen (Einsen):
z.B
oder numpy.ones ((x, y)) z
Es sind sogar drei Dimensionen möglich. ( http://www.astro.ufl.edu/~warner/prog/python.html siehe -> Mehrdimensionale Arrays)
quelle
So erstelle ich normalerweise 2D-Arrays in Python.
Ich finde diese Syntax leicht zu merken, verglichen mit der Verwendung von zwei for-Schleifen in einem Listenverständnis.
quelle
Ich bin in meinem ersten Python-Skript und war durch das Beispiel mit der quadratischen Matrix ein wenig verwirrt. Ich hoffe, das folgende Beispiel hilft Ihnen dabei, Zeit zu sparen:
damit
quelle
Mit NumPy können Sie eine leere Matrix wie folgt initialisieren:
Und später Daten wie folgt anhängen:
quelle
Ich habe in Kommas getrennte Dateien wie folgt gelesen:
Die Liste "Daten" ist dann eine Liste von Listen mit Indexdaten [Zeile] [Spalte]
quelle
Wenn Sie es als 2D-Array betrachten möchten, anstatt gezwungen zu sein, in Form einer Liste von Listen zu denken (meiner Meinung nach viel natürlicher), können Sie Folgendes tun:
Das Ergebnis ist eine Liste (kein NumPy-Array), und Sie können die einzelnen Positionen mit Zahlen, Zeichenfolgen usw. überschreiben.
quelle
numpy.matrix
gleichnumpy.zeros
ohne Nullen ohne Liste?Dafür ist das Wörterbuch gemacht!
Sie können Schlüssel und Werte auf zwei Arten definieren:
oder
Ergebnis:
quelle
Verwenden:
Ich denke, NumPy ist der richtige Weg. Das Obige ist generisch, wenn Sie NumPy nicht verwenden möchten.
quelle
mit Liste:
Mit dict: Sie können diese Informationen auch in der Hash-Tabelle speichern, um schnell suchen zu können
Matrix ['1'] gibt Ihnen das Ergebnis in O (1) Zeit
* nb : Sie müssen sich mit einer Kollision in der Hash-Tabelle befassen
quelle
Wenn Sie vor dem Start keine Größeninformationen haben, erstellen Sie zwei eindimensionale Listen.
Speichern Sie die gesamte Zeile in der 1. Liste. Wenn Sie fertig sind, fügen Sie Liste 1 in Liste 2 ein:
Ausgabe:
quelle
Seien Sie vorsichtig mit diesem kurzen Ausdruck, siehe die vollständige Erklärung unten in der Antwort von @ FJ
quelle
Matrix[0], Matrix[1], ..., Matrix[4]
alle auf dem gleichen Array, so nachMatrix[0][0] = 3
, die Sie erwarten würdenMatrix[0][0] == Matrix[1][0] == ... == Matrix[4][0] == 3
.Wird schneller sein als:
quelle
[[0]*(L) for i in range(W)]
sollte[[0]*(L) for _ in range(W)]
dai
nirgendwo verwendet werdenSie können eine leere zweidimensionale Liste erstellen, indem Sie zwei oder mehr eckige Klammern oder dritte Klammern (
[]
durch Komma getrennt) mit einer quadratischen Klammer verschachteln , wie unten dargestellt:Angenommen, Sie möchten 1 anhängen und
Matrix[0][0]
dann Folgendes eingeben:Geben Sie nun Matrix ein und drücken Sie die Eingabetaste. Die Ausgabe wird sein:
quelle
Versuche dies:
quelle
Wenn Sie eine Matrix mit vordefinierten Zahlen benötigen, können Sie den folgenden Code verwenden:
quelle
Hier ist das Code-Snippet zum Erstellen einer Matrix in Python:
Bitte schlagen Sie vor, wenn ich etwas verpasst habe.
quelle