it-swarm.com.de

Definieren eines zweidimensionalen Arrays in Python

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?

585
Masoud Abasian

Sie versuchen technisch ein nicht initialisiertes Array zu indizieren. Sie müssen zunächst 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 jetzt Elemente zur Liste hinzufügen:

Matrix[0][0] = 1
Matrix[6][0] = 3 # error! range... 
Matrix[0][6] = 3 # valid

print Matrix[0][0] # prints 1
x, y = 0, 6 
print Matrix[x][y] # prints 3; be careful with indexing! 

Obwohl Sie sie nach Belieben benennen können, schaue ich sie so an, um Verwirrungen zu vermeiden, die bei der Indizierung auftreten könnten, wenn Sie "x" für die innere und äußere Liste verwenden und eine nicht quadratische Matrix wünschen.

833
Manny D

Wenn Sie wirklich eine Matrix wünschen, können Sie numpy verwenden. Matrixoperationen in numpy verwenden meistens einen Array-Typ mit zwei Dimensionen. Es gibt viele Möglichkeiten, ein neues Array zu erstellen. Eine der nützlichsten Funktionen ist die zeros-Funktion, die einen Shape-Parameter annimmt und ein Array der angegebenen Form zurückgibt, wobei die Werte auf Null gesetzt werden:

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

numpy bietet auch einen matrix-Typ. Es wird weniger häufig verwendet und einige Leute empfehlen dagegen verwenden es. Aber es ist nützlich für Leute, die aus Matlab und in einigen anderen Kontexten zu numpy kommen. Ich dachte, ich würde es hinzufügen, da wir über Matrizen sprechen!

>>> numpy.matrix([[1, 2], [3, 4]])
matrix([[1, 2],
        [3, 4]])

Weitere Möglichkeiten zum Erstellen von 2D-Arrays und Matrizen (wobei die Ausgabe wegen der Kompaktheit entfernt wurde):

numpy.matrix('1 2; 3 4')                 # use Matlab-style syntax
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.ndarray((5, 5))                    # use the low-level constructor
347
senderle

Hier ist eine kürzere Schreibweise zum Initialisieren einer Liste von Listen:

matrix = [[0]*5 for i in range(5)]

Leider funktioniert das Verkürzen auf etwas wie 5*[5*[0]] nicht wirklich, da am Ende 5 Kopien derselben Liste vorhanden sind. Wenn Sie also eine davon ändern, ändern sie sich alle, zum Beispiel:

>>> 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]]
289
Andrew Clark

Wenn Sie eine leere Matrix erstellen möchten, lautet die korrekte Syntax

matrix = [[]]

Und wenn Sie eine Matrix der Größe 5 erzeugen möchten, die mit 0 gefüllt ist, 

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

Wenn Sie nur einen zweidimensionalen Container für einige Elemente benötigen, können Sie stattdessen ein Wörterbuch verwenden:

Matrix = {}

Dann können Sie tun:

Matrix[1,2] = 15
print Matrix[1,2]

Dies funktioniert, weil 1,2 ein Tuple ist und Sie es als Schlüssel zum Indexieren des Wörterbuchs verwenden. Das Ergebnis ähnelt einer dummen spärlichen Matrix.

Wie von osa und Josap Valls angegeben, können Sie auch Matrix = collections.defaultdict(lambda:0) verwenden, damit die fehlenden Elemente den Standardwert 0 haben.

Vatsal weist außerdem 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.

69
enobayram

In Python erstellen Sie eine Liste von Listen. Sie müssen die Abmessungen nicht vorab angeben, aber Sie können dies. Zum Beispiel:

matrix = []
matrix.append([])
matrix.append([])
matrix[0].append(2)
matrix[1].append(3)

Jetzt Matrix [0] [0] == 2 und Matrix [1] [0] == 3. Sie können auch die Listenverständnissyntax verwenden. In diesem Beispiel wird es zweimal verwendet, um eine "zweidimensionale Liste" zu erstellen:

from itertools import count, takewhile
matrix = [[i for i in takewhile(lambda j: j < (k+1) * 10, count(k*10))] for k in range(10)]
37
wberry

Die akzeptierte Antwort ist gut und richtig, aber ich brauchte eine Weile, um zu verstehen, dass ich damit auch ein völlig leeres Array erstellen könnte.

l =  [[] for _ in range(3)]

führt in

[[], [], []]
19
Fabian

Sie sollten eine Liste mit Listen erstellen. Am besten verwenden Sie verschachtelte Verwicklungen:

>>> matrix = [[0 for i in range(5)] for j in range(5)]
>>> pprint.pprint(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]]

In Ihrem [5][5]-Beispiel erstellen Sie eine Liste mit einer Ganzzahl "5" und versuchen, auf das fünfte Element zuzugreifen. Dies führt natürlich zu einem IndexError, da es keinen fünften Element gibt:

>>> l = [5]
>>> l[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
17
utdemir
rows = int(input())
cols = int(input())

matrix = []
for i in range(rows):
  row = []
  for j in range(cols):
    row.append(0)
  matrix.append(row)

print(matrix)

Warum so einen langen Code, den Sie auch in Python fragen?

Vor langer Zeit, als ich mit Python nicht vertraut war, sah ich die einzeiligen Antworten zum Schreiben von 2D-Matrizen und sagte mir, dass ich 2D-Matrizen nicht mehr in Python verwenden werde. (Diese einzelnen Zeilen waren ziemlich unheimlich und es gab mir keine Informationen darüber, was Python machte. Beachten Sie auch, dass mir diese Abkürzungen nicht bekannt sind.)

Wie auch immer, hier ist der Code für einen Anfänger, dessen Hintergrund C, CPP und Java ist

Hinweis für Python-Liebhaber und -Kenner: Bitte stimmen Sie nicht ab, nur weil ich einen ausführlichen Code geschrieben habe.

10
vardin

So deklarieren Sie eine Matrix von Nullen (Einsen):

numpy.zeros((x, y))

z.B.

>>> numpy.zeros((3, 5))
    array([[ 0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.]])

oder numpy.ones ((x, y)).

>>> np.ones((3, 5))
array([[ 1.,  1.,  1.,  1.,  1.],
   [ 1.,  1.,  1.,  1.,  1.],
   [ 1.,  1.,  1.,  1.,  1.]])

Es sind sogar drei Dimensionen möglich .. _. ( Http://www.astro.ufl.edu/~warner/prog/python.html siehe -> Mehrdimensionale Arrays)

10
khaz

Benutzen:

matrix = [[0]*5 for i in range(5)]

Die * 5 für die erste Dimension funktioniert, da auf dieser Ebene die Daten unveränderlich sind.

9
innov8

Eine Umschreibung zum einfachen Lesen:

# 2D array/ matrix

# 5 rows, 5 cols
rows_count = 5
cols_count = 5

# create
#     creation looks reverse
#     create an array of "cols_count" cols, for each of the "rows_count" rows
#        all elements are initialized to 0
two_d_array = [[0 for j in range(cols_count)] for i in range(rows_count)]

# index is from 0 to 4
#     for both rows & cols
#     since 5 rows, 5 cols

# use
two_d_array[0][0] = 1
print two_d_array[0][0]  # prints 1   # 1st row, 1st col (top-left element of matrix)

two_d_array[1][0] = 2
print two_d_array[1][0]  # prints 2   # 2nd row, 1st col

two_d_array[1][4] = 3
print two_d_array[1][4]  # prints 3   # 2nd row, last col

two_d_array[4][4] = 4
print two_d_array[4][4]  # prints 4   # last row, last col (right, bottom element of matrix)

Ich bin in meinem ersten Python-Skript und war etwas verwirrt von dem Beispiel der Quadratmatrix. Ich hoffe, das folgende Beispiel hilft Ihnen, Zeit zu sparen:

 # Creates a 2 x 5 matrix
 Matrix = [[0 for y in xrange(5)] for x in xrange(2)]

damit

Matrix[1][4] = 2 # Valid
Matrix[4][1] = 3 # IndexError: list index out of range
9
user110954

Mit NumPy können Sie eine leere Matrix folgendermaßen initialisieren:

import numpy as np
mm = np.matrix([])

Und später Daten wie folgt anhängen:

mm = np.append(mm, [[1,2]], axis=1)
7
Namrata Tolani

So erstelle ich normalerweise 2D-Arrays in Python.

col = 3
row = 4
array = [[0] * col for _ in range(row)]

Ich finde diese Syntax im Vergleich zu for für Schleifen in einem Listenverständnis leicht zu merken.

6
Michael

Ich las in durch Kommas getrennten Dateien wie folgt:

data=[]
for l in infile:
    l = split(',')
    data.append(l)

Die Liste "Daten" ist dann eine Liste von Listen mit Indexdaten [Zeile] [Spalte]

6
wsanders

Wenn Sie es als 2D-Array verstehen möchten, anstatt in Listenform zu denken (meiner Meinung nach viel natürlicher), können Sie Folgendes tun:

import numpy
Nx=3; Ny=4
my2Dlist= numpy.zeros((Nx,Ny)).tolist()

Das Ergebnis ist eine Liste (kein NumPy-Array), und Sie können die einzelnen Positionen mit Zahlen, Zeichenfolgen oder was auch immer überschreiben.

4
alessadnro

Benutzen:

import copy

def ndlist(*args, init=0):
    dp = init
    for x in reversed(args):
        dp = [copy.deepcopy(dp) for _ in range(x)]
    return dp

l = ndlist(1,2,3,4) # 4 dimensional list initialized with 0's
l[0][1][2][3] = 1

Ich denke, NumPy ist der Weg zu gehen. Das oben genannte ist ein generisches, wenn Sie NumPy nicht verwenden möchten.

4
pterodragon
# Creates a list containing 5 lists initialized to 0
Matrix = [[0]*5]*5

Seien Sie vorsichtig mit diesem kurzen Ausdruck, siehe vollständige Erklärung in @FJs Antwort

3
和風信使

Dafür ist dictionary gemacht!

matrix = {}

Sie können keys und values ​​auf zwei Arten definieren:

matrix[0,0] = value

oder

matrix = { (0,0)  : value }

Ergebnis:

   [ value,  value,  value,  value,  value],
   [ value,  value,  value,  value,  value],
   ...
3
KouchakYazdi

Wenn Sie vor dem Start keine Größeninformationen haben, erstellen Sie zwei eindimensionale Listen.

liste 1: Zum Speichern von Zeilen Liste 2: Tatsächliche zweidimensionale Matrix

Speichern Sie die gesamte Zeile in der 1. Liste. Wenn Sie fertig sind, hängen Sie die Liste 1 an die Liste 2 an:

from random import randint


coordinates=[]
temp=[]
points=int(raw_input("Enter No Of Coordinates >"))
for i in range(0,points):
    randomx=randint(0,1000)
    randomy=randint(0,1000)
    temp=[]
    temp.append(randomx)
    temp.append(randomy)
    coordinates.append(temp)

print coordinates

Ausgabe:

Enter No Of Coordinates >4
[[522, 96], [378, 276], [349, 741], [238, 439]]
2
Nagendra Nigade

mit der Liste: 

matrix_in_python  = [['Roy',80,75,85,90,95],['John',75,80,75,85,100],['Dave',80,80,80,90,95]]

mit dict: können Sie diese Informationen auch in der Hashtabelle speichern, um schnell zu suchen 

matrix = { '1':[0,0] , '2':[0,1],'3':[0,2],'4' : [1,0],'5':[1,1],'6':[1,2],'7':[2,0],'8':[2,1],'9':[2,2]};

matrix ['1'] liefert die Zeit in O(1) 

* nb : Sie müssen sich mit einer Kollision in der Hashtabelle befassen 

Sie können eine leere zweidimensionale Liste erstellen, indem Sie zwei oder mehr eckige Klammern oder dritte Klammern ([], durch Komma getrennt) wie folgt in eckige Klammern setzen:

Matrix = [[], []]

Angenommen, Sie möchten 1 an Matrix[0][0] anhängen und geben dann Folgendes ein:

Matrix[0].append(1)

Geben Sie nun Matrix ein und drücken Sie die Eingabetaste. Die Ausgabe wird sein:

[[1], []]
0
Meraj al Maksud
l=[[0]*(L) for i in range(W)]

Wird schneller sein als:

l = [[0 for x in range(L)] for y in range(W)] 
0
Harsh Sharma

Falls Sie eine Matrix mit vordefinierten Zahlen benötigen, können Sie den folgenden Code verwenden:

def matrix(rows, cols, start=0):
    return [[c + start + r * cols for c in range(cols)] for r in range(rows)]


assert matrix(2, 3, 1) == [[1, 2, 3], [4, 5, 6]]
0
Vlad Bezden

Versuche dies:

rows = int(input('Enter rows\n'))
my_list = []
for i in range(rows):
    my_list.append(list(map(int, input().split())))
0
Ankit Sharma