Ich möchte ein zweidimensionales Array ohne eine initialisierte Länge wie folgt definieren:
Matrix = [][]
Dies führt jedoch zu einem Fehler:
IndexError: Listenindex außerhalb des Bereichs
Ich möchte ein zweidimensionales Array ohne eine initialisierte Länge wie folgt definieren:
Matrix = [][]
Dies führt jedoch zu einem Fehler:
IndexError: Listenindex außerhalb des Bereichs
Sie versuchen technisch gesehen, 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".
# Creates a list containing 5 lists, each of 8 items, all set to 0
w, h = 8, 5
Matrix = [[0 for x in range(w)] for y in range(h)]
Matrix[0][0] = 1
Matrix[6][0] = 3 # error! range...
Matrix[0][6] = 3 # valid
Beachten Sie, dass die Matrix eine "y"-Adresse hat, d. h. der "y-Index" steht vor dem "x-Index".
print Matrix[0][0] # prints 1
x, y = 0, 6
print Matrix[x][y] # prints 3; be careful with indexing!
Obwohl Sie sie benennen können, wie Sie wollen, sehe ich es so, um Verwirrung zu vermeiden, die bei der Indexierung entstehen könnte, wenn Sie "x" sowohl für die innere als auch für die äußere Liste verwenden und eine nicht-quadratische Matrix wünschen.
Ungewöhnliche Bearbeitung durch ademar111190. In Python 3 gibt es kein xrange, aber wenn Sie Python 2 verwenden müssen, dann ist xrange die richtige Funktion, wenn Sie nicht unnötig Objekte erstellen wollen.
@dave Wenn Sie es nicht mit Nullen gefüllt haben wollen, können Sie range
um die internen Listen direkt zu erstellen: [range(5) for x in range(5)]
Wenn Sie wirklich eine Matrix wollen, ist es vielleicht besser, wenn Sie numpy
. Matrixoperationen in numpy
am häufigsten einen Array-Typ mit zwei Dimensionen verwenden. Es gibt viele Möglichkeiten, ein neues Array zu erstellen; eine der nützlichsten ist die zeros
Funktion, die einen Form-Parameter annimmt und ein Array der angegebenen Form zurückgibt, wobei die Werte auf Null initialisiert sind:
>>> import numpy
>>> numpy.zeros((5, 5))
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
Hier sind einige andere Möglichkeiten, 2D-Arrays und Matrizen zu erstellen (wobei die Ausgabe aus Gründen der Kompaktheit entfernt wurde):
numpy.arange(25).reshape((5, 5)) # create a 1-d range and reshape
numpy.array(range(25)).reshape((5, 5)) # pass a Python range and reshape
numpy.array([5] * 25).reshape((5, 5)) # pass a Python list and reshape
numpy.empty((5, 5)) # allocate, but don't initialize
numpy.ones((5, 5)) # initialize with ones
numpy
bietet eine matrix
Typ auch, aber es ist nicht mehr empfohlen pour tout Verwendung und kann entfernt werden von numpy
in der Zukunft.
Wann immer Sie Matrizen benötigen, sollten Sie Numpy verwenden. Diese Antwort sollte an erster Stelle stehen.
Die Tatsache, dass in der Frage das englische Wort "Matrix" verwendet wird, bedeutet nicht, dass sie die np.matrix
um sie zu repräsentieren. Die richtige Art und Weise, eine Matrix in Numpy darzustellen, ist mit einer array
.
@user2357112, Und wie Sie sehen können, Die meisten der oben aufgeführten Beispiele ausgeben array
s anstelle von Matrizen. Obwohl dies nicht immer empfohlen wird, gibt es berechtigte Gründe für die Verwendung von matrix
-- der Kontext ist wichtig.
Hier ist eine kürzere Notation für die Initialisierung einer Liste von Listen:
matrix = [[0]*5 for i in range(5)]
Leider kann man dies auf etwas wie 5*[5*[0]]
funktioniert nicht wirklich, weil man am Ende 5 Kopien derselben Liste hat, und wenn man eine davon ändert, ändern sich zum Beispiel alle:
>>> matrix = 5*[5*[0]]
>>> matrix
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> matrix[4][4] = 2
>>> matrix
[[0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2]]
Könnten Sie die Logik hinter dem "Verkürzungs"-Fehler erklären? Warum gibt Python in diesem Fall Kopien derselben Liste aus und ein Array verschiedener Zellen im Fall von [0]*5
?
Die obigen Kommentare sind nicht ganz richtig: [0]*5 erzeugt immer noch eine Sequenz mit 5 Verweisen auf dasselbe Objekt, das die Zahl 0 repräsentiert. Aber das werden Sie nie bemerken, weil 0 unveränderlich ist (ich würde sagen, 0 verhält sich wie ein Wert - oder man könnte es als einen primitiven Datentyp betrachten - weil es unveränderlich ist, so dass Sie nie Probleme mit Verweisen auf dasselbe Objekt bekommen, anstatt Kopien zu haben).
Mehr pythonisch: [[0]*5 for _ in range(5)]
mit anonymen Schleifenzählern, die Sie nicht verwenden
@KorayTugay Weil die Matrix durch Python-Listen (die Zeilen) dargestellt wird, die in einer anderen Liste (den Spalten) verschachtelt sind.
Wenn Sie nur einen zweidimensionalen Behälter für einige Elemente benötigen, können Sie stattdessen auch ein Wörterbuch verwenden:
Matrix = {}
Dann können Sie das tun:
Matrix[1,2] = 15
print Matrix[1,2]
Dies funktioniert, weil 1,2
ist ein Tupel, und Sie verwenden es als Schlüssel, um das Wörterbuch zu indizieren. Das Ergebnis ähnelt einer stummen Sparse-Matrix.
Wie von osa und Josap Valls angegeben, können Sie auch Matrix = collections.defaultdict(lambda:0)
so dass die fehlenden Elemente einen Standardwert von 0
.
Vatsal weist außerdem darauf hin, dass diese Methode für große Matrizen wahrscheinlich nicht sehr effizient ist und nur in nicht leistungsrelevanten Teilen des Codes verwendet werden sollte.
Dann können Sie auch import collections; Matrix = collections.defaultdict(float)
, um Nullen für nicht initialisierte Elemente zu ersetzen.
Würde der Zugriff auf ein Diktat für tuple(1,2) als Schlüssel nicht eine Worst-Case-Komplexität von O(n) haben. Denn intern würden die Tupel gehasht. Die Verwendung eines 2D-Arrays würde hingegen eine Zeitkomplexität von O(1) für den Zugriff auf den Index [1,2] ergeben. Die Verwendung eines Diktats sollte daher keine gute Wahl sein.
@Vatsal wiki.python.org/moin/Zeitkomplexität sagt, dass der durchschnittliche Fall O(1) ist, aber Sie haben Recht, was den schlimmsten Fall betrifft. Wie auch immer, wenn Sie nicht über eine Menge von Gegenständen sprechen, ist dieser Unterschied nicht wichtig. In der Tat würde ich mir mehr Sorgen um den Speicher als um die Zugriffszeit machen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
18 Stimmen
Man muss nicht Arrays definieren oder irgendetwas anderes. Sie können jedoch mehrdimensionale Sequenzen erstellen, wie die Antworten hier zeigen. Denken Sie daran, dass Python Variablen sind untypisiert, aber Werte sind stark typisiert.
2 Stimmen
Ich bin verwirrt. Von anderen Sprachen kommend: es IST ein Unterschied zwischen einem 1D-Array, das 1D-Arrays enthält und einem 2D-Array. Und AFAIK gibt es keine Möglichkeit, ein mehrdimensionales Array (oder Liste) in Python zu haben. Sollte hier gesagt werden...
4 Stimmen
Siehe auch die Python3-FAQ auf Wie kann ich eine mehrdimensionale Liste erstellen?