una - unir dos matrices en python
Iterando a través de una matriz multidimensional en Python (6)
He creado una matriz multidimensional en Python como esta:
self.cells = np.empty((r,c),dtype=np.object)
Ahora quiero iterar a través de todos los elementos de mi matriz bidimensional, y no me importa el orden. ¿Cómo logro esto?
Está claro que estás usando numpy. Con numpy puedes hacer:
for cell in self.cells.flat:
do_somethin(cell)
Nadie tiene una respuesta que funcione de forma arbitraria en muchas dimensiones sin numpy, así que pondré aquí una solución recursiva que he usado
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
# ..
Esto no tiene una muy buena comprobación de errores pero funciona para mí
Qué tal esto:
import itertools
for cell in itertools.chain(*self.cells):
cell.drawCell(surface, posx, posy)
Si necesita cambiar los valores de las celdas individuales, entonces ndenumerate (en numpy) es su amigo. ¡Incluso si no lo haces, probablemente todavía lo sea!
for index,value in ndenumerate( self.cells ):
do_something( value )
self.cells[index] = new_value
Solo itere sobre una dimensión, luego la otra.
for row in self.cells:
for cell in row:
do_something(cell)
Por supuesto, con solo dos dimensiones, puede comprimir esto en un solo ciclo utilizando una lista de comprensión o expresión del generador, pero eso no es muy escalable o legible:
for cell in (cell for row in self.cells for cell in row):
do_something(cell)
Si necesita escalar esto a múltiples dimensiones y realmente desea una lista plana, puede escribir una función flatten
.
puede obtener el índice de cada elemento así como también el elemento usando el comando enumerar:
for (i,row) in enumerate(cells):
for (j,value) in enumerate(row):
print i,j,value
i
, j
contiene el índice de fila y columna del elemento y el value
es el elemento mismo.