37

私は次のようにPythonで多次元配列を作成しました:

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

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

4

7 に答える 7

50

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

for cell in self.cells.flat:
    do_somethin(cell)
于 2009-06-09T18:34:53.443 に答える
30

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

for index,value in ndenumerate( self.cells ):
    do_something( value )
    self.cells[index] = new_value
于 2011-01-06T08:56:36.303 に答える
18

1つの次元を繰り返し、次に他の次元を繰り返します。

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

もちろん、2次元しかない場合は、リスト内包表記またはジェネレータ式を使用してこれを1つのループに圧縮できますが、これはあまりスケーラブルではなく、読みやすくありません。

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

これを複数の次元にスケーリングする必要があり、本当にフラットなリストが必要な場合はflatten関数を作成できます。

于 2009-06-09T18:29:32.547 に答える
8

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

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

ij要素の行と列のインデックスを含み、value要素自体です。

于 2015-11-23T04:18:17.917 に答える
6

これはどう:

import itertools
for cell in itertools.chain(*self.cells):
    cell.drawCell(surface, posx, posy)
于 2009-06-09T18:35:06.797 に答える
5

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

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

于 2016-02-06T22:12:58.847 に答える
1

言及する価値があるかもしれません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]))
于 2018-10-11T10:11:00.740 に答える