897 Stimmen

Wie definiert man ein zweidimensionales Array?

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

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

1238voto

Manny D Punkte 19512

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)] 

Sie können der Liste nun Einträge hinzufügen:

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.

250 Stimmen

[[0 for x in range(cols_count)] for x in range(rows_count)]

3 Stimmen

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.

4 Stimmen

@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)]

475voto

senderle Punkte 135243

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.

97 Stimmen

Wann immer Sie Matrizen benötigen, sollten Sie Numpy verwenden. Diese Antwort sollte an erster Stelle stehen.

4 Stimmen

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 .

0 Stimmen

@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.

399voto

Andrew Clark Punkte 193562

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]]

11 Stimmen

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 ?

22 Stimmen

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).

11 Stimmen

Mehr pythonisch: [[0]*5 for _ in range(5)] mit anonymen Schleifenzählern, die Sie nicht verwenden

143voto

mripard Punkte 2168

Wenn Sie eine leere Matrix erstellen wollen, lautet die korrekte Syntax

matrix = [[]]

Und wenn Sie eine Matrix der Größe 5 erzeugen wollen, die mit 0,

matrix = [[0 for i in xrange(5)] for i in xrange(5)]

2 Stimmen

@KorayTugay Weil die Matrix durch Python-Listen (die Zeilen) dargestellt wird, die in einer anderen Liste (den Spalten) verschachtelt sind.

3 Stimmen

Für Python-3 verwenden Sie die Funktion range statt xrange func

2 Stimmen

Ich denke matrix = [[]] braucht dann .append um tatsächlich einen Index zu erstellen. Denn sonst matrix[0][0] = 1 funktioniert noch nicht.

91voto

enobayram Punkte 4548

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.

2 Stimmen

Dann können Sie auch import collections; Matrix = collections.defaultdict(float) , um Nullen für nicht initialisierte Elemente zu ersetzen.

2 Stimmen

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.

0 Stimmen

@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.com

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.

Powered by:

X