Pythonのような多次元配列を作成しました:
self.cells = np.empty((r,c),dtype=np.object)
次に、2次元配列のすべての要素を反復処理したいのですが、順序は気にしません。どうすればこれを達成できますか?
Numpyを使用していることは明らかです。 numpyを使用すると、次のことができます。
for cell in self.cells.flat:
do_somethin(cell)
個々のセルの値を変更する必要がある場合は、ndenumerate(numpy)が友達です。あなたがそうしなくても、おそらくまだそうです!
for index,value in ndenumerate( self.cells ):
do_something( value )
self.cells[index] = new_value
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
関数を記述する を使用できます。
enumerateコマンドを使用して、各要素のインデックスと要素自体を取得できます。
for (i,row) in enumerate(cells):
for (j,value) in enumerate(row):
print i,j,value
i
、j
には要素の行と列のインデックスが含まれ、value
は要素自体です。
これはどう:
import itertools
for cell in itertools.chain(*self.cells):
cell.drawCell(surface, posx, posy)
誰も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
# ..
これは非常に良いエラーチェックを持っていませんが、私にとってはうまくいきます
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]))