web-dev-qa-db-fra.com

Comment définir un tableau à deux dimensions en Python

Je veux définir un tableau à deux dimensions sans une longueur initialisée comme ceci:

Matrix = [][]

mais ça ne marche pas ...

J'ai essayé le code ci-dessous, mais c'est faux aussi:

Matrix = [5][5]

Erreur:

Traceback ...

IndexError: list index out of range

Quelle est mon erreur?

585
Masoud Abasian

Vous essayez techniquement d'indexer un tableau non initialisé. Vous devez d'abord initialiser la liste externe avec des listes avant d'ajouter des éléments; Python appelle cela "Liste compréhension".

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

Vous pouvez maintenant ajouter des éléments à la liste:

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! 

Bien que vous puissiez les nommer comme vous le souhaitez, je le regarde de cette façon pour éviter toute confusion pouvant survenir avec l'indexation, si vous utilisez "x" pour les listes intérieure et extérieure et que vous souhaitez une matrice non carrée.

833
Manny D

Si vous voulez vraiment une matrice, mieux vaut utiliser numpy. Les opérations de matrice dans numpy utilisent le plus souvent un type de tableau à deux dimensions. Il existe plusieurs façons de créer un nouveau tableau. L’une des plus utiles est la fonction zeros, qui prend un paramètre de forme et renvoie un tableau de la forme donnée, avec les valeurs initialisées à zéro:

>>> 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 fournit également un type matrix. Il est moins couramment utilisé, et certaines personnes déconseillent l’utilisent. Mais c'est utile pour les personnes qui viennent à numpy de Matlab, et dans d'autres contextes. Je pensais l'inclure puisque nous parlons de matrices!

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

Voici d'autres manières de créer des tableaux et des matrices 2D (la sortie étant supprimée pour des raisons de compacité):

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

Voici une notation plus courte pour initialiser une liste de listes:

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

Malheureusement, réduire ceci à quelque chose comme 5*[5*[0]] ne fonctionne pas vraiment car vous vous retrouvez avec 5 copies de la même liste. Ainsi, lorsque vous en modifiez une, elles changent toutes, par exemple:

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

Si vous voulez créer une matrice vide, la syntaxe correcte est la suivante:

matrix = [[]]

Et si vous voulez générer une matrice de taille 5 remplie de 0, 

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

Si tout ce que vous voulez, c'est un conteneur bidimensionnel pouvant contenir certains éléments, vous pouvez facilement utiliser un dictionnaire:

Matrix = {}

Ensuite, vous pouvez faire:

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

Cela fonctionne parce que 1,2 est un tuple et que vous l'utilisez comme clé pour indexer le dictionnaire. Le résultat est similaire à une matrice maigre et clairsemée.

Comme indiqué par osa et Josap Valls, vous pouvez également utiliser Matrix = collections.defaultdict(lambda:0) pour que les éléments manquants aient une valeur par défaut de 0.

Vatsal ajoute que cette méthode n’est probablement pas très efficace pour les grandes matrices et ne doit être utilisée que dans des parties non critiques du code.

69
enobayram

En Python, vous allez créer une liste de listes. Vous n'êtes pas obligé de déclarer les dimensions à l'avance, mais vous le pouvez. Par exemple:

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

Maintenant, matrice [0] [0] == 2 et matrice [1] [0] == 3. Vous pouvez également utiliser la syntaxe de compréhension de liste. Cet exemple l'utilise deux fois pour construire une "liste à deux dimensions":

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

La réponse acceptée est bonne et correcte, mais il m'a fallu un certain temps pour comprendre que je pouvais aussi l'utiliser pour créer un tableau complètement vide.

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

résulte en

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

Vous devriez faire une liste de listes, et le meilleur moyen est d'utiliser des compréhensions imbriquées:

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

Sur votre exemple [5][5], vous créez une liste avec un entier "5" à l'intérieur et essayez d'accéder à son 5ème élément, ce qui génère naturellement une IndexError car il n'y a pas de cinquième élément:

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

Pourquoi un code si long, que vous demandez aussi dans Python?

Il y a longtemps que je n'étais pas à l'aise avec Python, j'ai vu les réponses à une seule ligne pour écrire une matrice 2D et je me suis dit que je n'allais plus utiliser la matrice à deux dimensions en Python. (Ces lignes simples étaient plutôt effrayantes et cela ne me donnait aucune information sur ce que faisait Python. Notez également que je ne suis pas au courant de ces raccourcis.)

Quoi qu'il en soit, voici le code pour un débutant dont les origines C, CPP et Java

Note aux amoureux et experts de Python: S'il vous plaît, ne votez pas simplement parce que j'ai écrit un code détaillé.

10
vardin

Pour déclarer une matrice de zéros (uns):

numpy.zeros((x, y))

par exemple.

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

ou numpy.ones ((x, y)) p. ex.

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

Même trois dimensions sont possibles . ( http://www.astro.ufl.edu/~warner/prog/python.html see -> Tableaux multidimensionnels)

10
khaz

Utilisation:

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

Le * 5 pour la première dimension fonctionne car à ce niveau les données sont immuables.

9
innov8

Une réécriture facile à lire:

# 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)
9

J'en suis à mon premier script Python, et l'exemple de la matrice carrée m'a quelque peu confus. J'espère que l'exemple ci-dessous vous aidera à gagner du temps:

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

pour que

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

En utilisant NumPy, vous pouvez initialiser une matrice vide comme ceci:

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

Et plus tard, ajoutez des données comme ceci:

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

C'est ainsi que je crée habituellement des tableaux 2D en python.

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

Je trouve cette syntaxe facile à retenir par rapport à l'utilisation de boucles for dans une liste de compréhension.

6
Michael

Je lis des fichiers séparés par des virgules comme ceci:

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

La liste "data" est alors une liste de listes avec index data [row] [col]

6
wsanders

Si vous voulez pouvoir le penser comme un tableau 2D plutôt que d'être obligé de penser en termes de liste de listes (beaucoup plus naturel à mon avis), vous pouvez procéder comme suit:

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

Le résultat est une liste (et non un tableau NumPy), et vous pouvez écraser les positions individuelles avec des nombres, des chaînes, etc.

4
alessadnro

Utilisation:

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

Je pense que NumPy est la voie à suivre. Ce qui précède est un générique si vous ne voulez pas utiliser NumPy.

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

Faites attention à cette courte expression, voir l'explication complète dans la réponse de @FJ

3
和風信使

C'est ce que dictionary est fait pour!

matrix = {}

Vous pouvez définir clés et valeurs de deux manières:

matrix[0,0] = value

ou

matrix = { (0,0)  : value }

Résultat:

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

Si vous n'avez pas les informations de taille avant de commencer, créez deux listes unidimensionnelles.

liste 1: pour stocker les lignes liste 2: matrice bidimensionnelle réelle

Stockez la ligne entière dans la 1ère liste. Une fois cela fait, ajoutez la liste 1 à la liste 2:

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

Sortie:

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

en utilisant la liste: 

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

en utilisant dict: vous pouvez également stocker ces informations dans la table de hachage pour une recherche rapide 

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

la matrice ['1'] vous donnera le résultat en O(1) temps 

* nb : vous devez gérer une collision dans la table de hachage 

2

Vous pouvez créer une liste bidimensionnelle vide en imbriquant deux croisillons ou trois crochets ([], séparés par une virgule) ou plus, avec un croisillon, comme ci-dessous:

Matrix = [[], []]

Supposons maintenant que vous vouliez ajouter 1 à Matrix[0][0] puis vous tapez:

Matrix[0].append(1)

Maintenant, tapez Matrix et appuyez sur Entrée. La sortie sera:

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

Sera plus rapide que:

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

Si vous avez besoin d’une matrice avec des nombres prédéfinis, vous pouvez utiliser le code suivant:

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

Essaye ça:

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