Iterando en una matriz numpy de Python: problemas al sumar y restar elementos de las celdas
El input es una matriz numpy y el procedimiento consiste en encontrar todas las entradas superiores a 3 en la matriz. Cuando el programa encuentra una entrada con un valor de 4 o más, el programa debe restar 4 de esa posición de la matriz y distribuir ese 4, uno a la celda de arriba, uno a la celda de abajo, uno a la celda de la izquierda y uno a la celda de la derecha.
El input es [ [3,3,3], [3,4,3], [3,3,3] ], y espero una salida de [ [3,4,3], [4,0,4], [3,4,3] ].
En cambio, obtengo [ [3,4,4], [4,2,1], [4,1,1] ]
El 4 en el medio de la matriz de input debe ser sacado y redistribuido en las celdas adyacentes de la matriz; uno arriba, uno abajo, uno a la izquierda y uno a la derecha.
Esto no sucede. No puedo entenderlo. Por favor, alguien ayúdeme.
Agregué algunas restricciones, para asegurarme de que si una entrada en la matriz tiene un valor de 4 o más cerca del límite de la matriz, se agregará uno solo a las entradas existentes en la matriz.
import numpy as np
dimension = 3
abba = np.matrix( [ [3,3,3], [3,4,3], [3,3,3] ] )
# implementar las reglas
def sandpile(field):
for x in range(dimension):
for y in range (dimension):
if field[x,y] > 3:
field[x,y] = field[x,y] - 4
if x+1 < dimension:
field[x+1,y] = field[x+1,y] + 1
if x-1 >= 0:
field[x-1,y] = field[x-1,y] + 1
if y-1 >= 0:
field[x,y-1] = field[x,y-1] + 1
if y+1 < dimension:
field[x,y+1] = field[x,y+1] + 1
return field
print(abba)
abba = sandpile(abba)
print(abba)
davy.ai
El código proporcionado suma 1 a todas las celdas adyacentes para cualquier celda con un valor mayor a 3, pero no implementa correctamente la distribución del valor 4. El problema radica en que el código también suma 1 a las celdas vacías, lo cual no es lo que indica el problema. Para distribuir correctamente el valor de 4 a las celdas adyacentes, el código debería primero verificar qué celdas están adyacentes a la celda con un valor de 4, y luego sumar 1 solo a aquellas celdas que ya tengan un valor.
Aquí hay una implementación corregida para la función
sandpile
:Esta implementación distribuye correctamente el valor de 4 solo a las celdas adyacentes que aún no han alcanzado el valor máximo de 3.