私は次のようにPythonで多次元配列を作成しました:
self.cells = np.empty((r,c),dtype=np.object)
ここで、2次元配列のすべての要素を反復処理したいので、順序は気にしません。どうすればこれを達成できますか?
私は次のように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つの次元を繰り返し、次に他の次元を繰り返します。
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
関数を作成できます。
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]))