2009-06-09 19 views
24

Ich habe ein mehrdimensionales Array in Python wie folgt erstellt:Iterieren durch ein mehrdimensionales Array in Python

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

Jetzt habe ich durch alle Elemente meiner zweidimensionalen Array zu durchlaufen will, und ich über die Reihenfolge nicht. Wie erreiche ich das?

Antwort

38

Es ist klar, dass Sie numpy verwenden. Mit numpy können Sie einfach tun:

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

Ich denke, jetzt gibt es einen effektiveren Weg, dies mit ['numpy.nditer()'] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.nditer.html) – tuned

13

Iterieren Sie einfach über eine Dimension, dann die andere.

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

Natürlich mit nur zwei Dimensionen, können Sie diese komprimieren zu einer einzigen Schleife eines list comprehension oder Generator Ausdruck mit nach unten, aber das ist nicht sehr skalierbar oder lesbar:

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

Wenn Sie müssen skalieren Sie dies auf mehrere Dimensionen und wollen wirklich eine flache Liste, können Sie write a flatten function.

+1

Sie haben es falsch verstanden. Es sollte sein: für Zelle in [Zelle für Zeile in self.cells für Zelle in Zeile]: do_something (Zelle) – xApple

+0

Wow, diese Antwort ist uralt. Du hast recht; werde reparieren. – Eevee

+0

Ist das nicht so, wie er es gemacht hat? Es ist nur ein Generatorausdruck anstelle eines Listenverständnisses ... vermisse ich etwas? O.o –

4

Wie wäre es damit:

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

'zu tun itertools.chain.from_iterable (self.cells) ' – jfs

26

Wenn Sie die Werte der einzelnen Zellen ändern müssen dann ndenumerate (in numpy) ist dein Freund. Selbst wenn du es nicht tust, ist es wahrscheinlich immer noch!

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

können Sie den Index jedes Elements sowie das Element erhalten selbst Befehl aufzählen:

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

i, j enthalten die Zeilen- und Spaltenindex des Elements und value wird das Element selbst .

2

Niemand hat eine Antwort, die Form beliebig viele Dimensionen ohne numpy arbeiten, also werde ich hier eine rekursive Lösung setzen, die ich

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

dies nicht sehr gut Fehler haben benutzt habe Überprüfung aber es funktioniert für mich