Pergunta

Eu criei uma matriz multidimensional em Python como esta:

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

Agora eu quero para percorrer todos os elementos da minha matriz bidimensional, e eu não se preocupam com a ordem. Como faço para conseguir isso?

Foi útil?

Solução

É claro que você está usando numpy. Com numpy você pode apenas fazer:

for cell in self.cells.flat:
    do_somethin(cell)

Outras dicas

Se você precisar alterar os valores das células individuais, em seguida, ndenumerate (em numpy) é seu amigo. Mesmo se você não fazê-lo, provavelmente, ainda é!

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

Apenas iterar sobre uma dimensão, depois o outro.

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

Claro que, com apenas duas dimensões, você pode comprimir esse baixo para um único laço usando um compreensão da lista ou gerador de expressão, mas isso não é muito escalável ou legível:

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

Se você precisa de escala isso para múltiplas dimensões e realmente quer uma lista simples, você pode escrever uma função flatten .

Você pode obter o índice de cada elemento, bem como o próprio elemento usando o comando enumerar:

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

i, j conter a linha e a coluna do índice do elemento e value é o próprio elemento.

Como sobre isto:

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

Ninguém tem uma resposta que formam trabalho vontade arbitrariamente muitas dimensões sem numpy, então eu vou colocar aqui uma solução recursiva que eu usei

def iterThrough(lists):
  if not hasattr(lists[0], '__iter__'):
    for val in lists:
      yield val
  else:
    for l in lists:
      for val in iterThrough(l):
        yield val

for val in iterThrough(
  [[[111,112,113],[121,122,123],[131,132,133]],
   [[211,212,213],[221,222,223],[231,232,233]],
   [[311,312,313],[321,322,323],[331,332,333]]]):
  print(val)
  # 111
  # 112
  # 113
  # 121
  # ..

Este não tem muito boa verificação de erros, mas ele funciona para mim

Pode ser também vale a pena mencionar 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]))

Pode criar produto cartesiano de um número arbitrário de iterables:

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]))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top