Question Comment définir un tableau bidimensionnel 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?


523
2017-07-12 15:54


origine


Réponses:


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 "compréhension de la liste".

# 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 vois de cette façon pour éviter toute confusion qui pourrait survenir avec l'indexation, si vous utilisez "x" pour les listes interne et externe, et que vous voulez une matrice non carrée.


745
2017-07-12 15:59



Si vous voulez vraiment une matrice, vous feriez mieux d'utiliser numpy. Opérations matricielles dans numpy utilisent le plus souvent un type de tableau avec deux dimensions. Il existe plusieurs façons de créer un nouveau tableau. l'un des plus utiles est le zeros function, 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 un matrix tapez aussi. Il est moins couramment utilisé, et certaines personnes recommander contre En l'utilisant. Mais c'est utile pour les gens 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 façons de créer des matrices et matrices 2-D (avec une sortie supprimée pour plus 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

321
2017-07-12 16:04



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

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

Malheureusement, raccourcir cela à quelque chose comme 5*[5*[0]] ne fonctionne pas vraiment parce que vous finissez avec 5 copies de la même liste, donc quand vous modifiez l'un d'entre eux, ils changent tous, 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]]

256
2017-07-12 16:17



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

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

74
2017-07-12 16:00



Si tout ce que vous voulez est un conteneur bidimensionnel pour contenir certains éléments, vous pouvez facilement utiliser un dictionnaire à la place:

Matrix = {}

Alors vous pouvez faire:

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

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

Comme indiqué par osa et Josap Valls, vous pouvez également utiliser Matrix = collections.defaultdict(lambda:0) de sorte que les éléments manquants ont 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 devrait être utilisée que dans des parties non critiques du code.


64
2018-05-29 07:23



En Python, vous allez créer une liste de listes. Vous n'avez pas à 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 bidimensionnelle":

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

34
2017-07-12 16:04



La réponse acceptée est bonne et correcte, mais il m'a fallu du 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

[[], [], []]

16
2017-12-04 14:13



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 ton [5][5] Par exemple, vous créez une liste avec un entier "5" à l'intérieur, et essayez d'accéder à son 5ème élément, et cela soulève naturellement une erreur IndexError car il n'y a pas de 5ème élément:

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

15
2017-07-12 16:00