web-dev-qa-db-ja.com

Pythonの多次元配列を反復処理する

Pythonのような多次元配列を作成しました:

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

次に、2次元配列のすべての要素を反復処理したいのですが、順序は気にしません。どうすればこれを達成できますか?

27
utdiscant

Numpyを使用していることは明らかです。 numpyを使用すると、次のことができます。

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

個々のセルの値を変更する必要がある場合は、ndenumerate(numpy)が友達です。あなたがそうしなくても、おそらくまだそうです!

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

1つの次元を反復してから、もう1つの次元を反復します。

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

もちろん、2次元のみの場合、 list comprehension またはジェネレーター式を使用して、これを1つのループに圧縮できますが、それは非常にスケーラブルでも読みやすいものでもありません。

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

これを複数の次元にスケーリングする必要があり、実際にフラットリストが必要な場合は、 flatten関数を記述する を使用できます。

15
Eevee

enumerateコマンドを使用して、各要素のインデックスと要素自体を取得できます。

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

ijには要素の行と列のインデックスが含まれ、valueは要素自体です。

7

これはどう:

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

誰もnumpyなしで任意の多くの次元で機能する答えはありませんので、ここで私が使用した再帰的なソリューションを置きます

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

これは非常に良いエラーチェックを持っていませんが、私にとってはうまくいきます

4
Frank Bryce

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

任意の数の反復可能物のデカルト積を作成できます。

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