es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
Tags:  , , ,

Answer

  1. Avatar for 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:

    def sandpile(field):
        for x in range(dimension):
            for y in range(dimension):
                if field[x, y] >= 4:
                    field[x, y] -= 4
                    if x+1 < dimension and field[x+1, y] < 4:
                        field[x+1, y] += 1
                    if x-1 >= 0 and field[x-1, y] < 4:
                        field[x-1, y] += 1
                    if y+1 < dimension and field[x, y+1] < 4:
                        field[x, y+1] += 1
                    if y-1 >= 0 and field[x, y-1] < 4:
                        field[x, y-1] += 1
        return field
    

    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.

Comments are closed.