web-dev-qa-db-fra.com

Itération à travers un tableau multidimensionnel en Python

J'ai créé un tableau multidimensionnel en Python comme ceci:

self.cells = np.empty((r,c),dtype=np.object)

Maintenant, je veux parcourir tous les éléments de mon tableau bidimensionnel, et je me fiche de l'ordre. Comment puis-je y parvenir?

27
utdiscant

Si vous devez modifier les valeurs des cellules individuelles, alors ndenumerate (en numpy) est votre ami. Même si vous ne le faites pas, c'est probablement toujours le cas!

for index,value in ndenumerate( self.cells ):
    do_something( value )
    self.cells[index] = new_value
29
Carl Bellingan

Parcourez simplement une dimension, puis l'autre.

for row in self.cells:
    for cell in row:
        do_something(cell)

Bien sûr, avec seulement deux dimensions, vous pouvez compresser cela en une seule boucle en utilisant une expression compréhension de liste ou générateur, mais ce n'est pas très évolutif ou lisible:

for cell in (cell for row in self.cells for cell in row):
    do_something(cell)

Si vous avez besoin de redimensionner cela à plusieurs dimensions et que vous voulez vraiment une liste plate, vous pouvez écrire une fonction flatten .

15
Eevee

vous pouvez obtenir l'index de chaque élément ainsi que l'élément lui-même à l'aide de la commande enumerate:

for (i,row) in enumerate(cells):
  for (j,value) in enumerate(row):
    print i,j,value

i, j contient l'index de ligne et de colonne de l'élément et value est l'élément lui-même.

7
shahram kalantari

Que dis-tu de ça:

import itertools
for cell in itertools.chain(*self.cells):
    cell.drawCell(surface, posx, posy)
6
Tim Pietzcker

Il peut également être utile de mentionner itertools.product().

cells = [[x*y for y in range(5)] for x in range(10)]
for x,y in itertools.product(range(10), range(5)):
    print("(%d, %d) %d" % (x,y,cells[x][y]))

Il peut créer un produit cartésien d'un nombre arbitraire d'itérables:

cells = [[[x*y*z for z in range(3)] for y in range(5)] for x in range(10)]
for x,y,z in itertools.product(range(10), range(5), range(3)):
    print("(%d, %d, %d) %d" % (x,y,z,cells[x][y][z]))
1
Alexey Tigarev