Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: eLank0 en 12 Marzo 2013, 23:34 pm



Título: [Python] Sumatorio de elementos adyacentes en una matriz [SOLUCIONADO]
Publicado por: eLank0 en 12 Marzo 2013, 23:34 pm
Hola, tengo un problema con el cual llevo varios días comiendome la cabeza. La cuestión es que tengo que realizar un ejercicio el cual se trata de que dada una matriz numérica cualquiera, la función o programa devuelva otra matriz cuyos elementos sean la suma de los elementos que rodeaban a los de la matriz anterior, espero haberme explicado.

Yo de momento he codificado hasta aquí, pero el resultado que me da es erroneo:

Código
  1. L = [
  2.     [1,2,3],
  3.     [2,4,7],
  4.     [5,6,7]
  5.    ]
  6.  
  7. L2 = [
  8.     [0,0,0],
  9.     [0,0,0],
  10.     [0,0,0]
  11.    ]
  12.  
  13. for i_rows in range(0,len(L)):
  14.  
  15.    for i_cols in range(len(L[i_rows])):
  16.  
  17.        for i in range(i_rows-1, i_rows+1):
  18.            for j in range(i_cols-1, i_cols+1):
  19.  
  20.                if i_cols >= 0 and i_rows >= 0:
  21.                    L2[i_rows][i_cols] += L[i][j]
  22.  
  23. print(L2[0])
  24. print(L2[1])
  25. print(L2[2])

Espero que me echen una mano, únicamente me gustaría un poco de información para codificar correctamente el algoritmo.

Gracias.


Título: Re: [Python] Sumatorio de elementos adyacentes en una matriz
Publicado por: eLank0 en 14 Marzo 2013, 00:38 am
Hola de nuevo,

Os publicaré los avances que he hecho. Ahora ya consigo recorrer correctamente los elementos adyacentes a mi elemento parámetro:

Código
  1. L = [
  2.     [1,2,3],
  3.     [2,4,7],
  4.     [5,6,7]
  5.    ]
  6.  
  7. L2 = []
  8.  
  9. #Buscamos los vecinos de la posición L[1, 0]
  10.  
  11. a = 1
  12. b = 0
  13.  
  14. for i in range (a-1, a+2, 1):
  15.    for j in range (b-1, b+2, 1):
  16.        if i >= 0 and j >= 0:
  17.            print(L[i][j])
  18.  
  19. #for item in L2:
  20.    #print(item, end=' ')

La salida de este código es:

Citar
1
2
2
4
5
6

Ahora lo último que me falta es una segunda condición en el segundo bucle para que cuando llegue a la posición [a], no imprima nada (No debería imprimir el segundo 2).

He provado con:

Código
  1. if i is not a and j is not b:
  2.     print(L[i][j])

No me da el resultado correcto.

¿Cómo debería ser esta condición para que haga exactamente lo que yo quiero que es saltarme la posición [a] ?

Gracias!
            

PD: Nótese que he cambiado un poco el código para hacerlo más sencillo y así acatar el problema de raíz y cuando reciba los números correctos, ya haré el sumatorio, que es lo de menos.


Título: Re: [Python] Sumatorio de elementos adyacentes en una matriz
Publicado por: Danyfirex en 14 Marzo 2013, 00:47 am
no entiendo a que sumatoria. explícate.

a que sumatoria te refieres?


Título: Re: [Python] Sumatorio de elementos adyacentes en una matriz
Publicado por: eLank0 en 14 Marzo 2013, 19:22 pm
Hola,

Pues dada la matriz L y como parámetro una posición por ejemplo a = 1 y b = 0, que en este caso es el número 2, obtener el sumatorio de sus elementos adyacentes (o vecinos) que son el 1, 2, 4, 5, 6.

El recorrido del bucle ahora ya es perfecto, o sea, está bien. Recorre todas las posiciones desde [a-1][b-1] hasta [a+1][b-1] siempre positivos para que no coja la matriz por el lado opuesto.

Lo que falta es saber qué condición falta para que se salte la posición parámetro ya que no interesa en el sumatorio.

Gracias.



Título: Re: [Python] Sumatorio de elementos adyacentes en una matriz
Publicado por: MCKSys Argentina en 14 Marzo 2013, 19:32 pm
Si no entendi mal, lo que quieres es la sumatoria de los elementos circundantes a un elemento dado.

Teniendo en cuanta que los elementos estan a distancia 1 (posicionalmente hablando), seria algo tan sencillo como:

busqueda: (a,b)

sumatoria: (a-1, b-1) + (a-1, b) + (a-1, b+1) + (a, b-1) + (a, b) + (a, b+1) + (a+1, b-1) + (a+1, b) + (a+1, b+1)

Solo hay que verificar que las posiciones sean validas (por ejemplo si (a,b) esta en un extremo de la matriz o si esta a un "costado")

Si no es asi, entendi mal...  :P

Saludos!


Título: Re: [Python] Sumatorio de elementos adyacentes en una matriz
Publicado por: eLank0 en 14 Marzo 2013, 19:45 pm
Es así de hecho, si te fijas en el código lo hace correctamente pero durante el recorrido de los bucles, se pasa siempre por la posición parámetro. Por [a] no hay que pasar.

Necesito saber como escribir la condición correcta para que se la salte.

Gracias.


Título: Re: [Python] Sumatorio de elementos adyacentes en una matriz
Publicado por: MCKSys Argentina en 14 Marzo 2013, 19:52 pm
El pseudo-codigo que puse no usa bucles y es muy sencillo de implementar en python.

Si no quieres que el elemento buscado se sume, quitalo de la sumatoria.

Con los bucles estas recorriendo innecesariamente la matriz.

Saludos!


Título: Re: [Python] Sumatorio de elementos adyacentes en una matriz
Publicado por: eLank0 en 14 Marzo 2013, 23:19 pm
Quizá tengas razón pero a mi modo de entender no es demasiado 'bonito' ese trozo de código con tantos sumandos pudiendo automatizarlo todo.

De hecho acabo de completar mi algoritmo:

Código
  1. def SumaVecinos(M, FIL, COL):
  2. '''
  3. (int, int) -> int
  4.  
  5. Realiza el sumatorio de los elementos adyacentes al elemento [FIL][COL] de la matriz M.
  6. '''
  7.  
  8. L = []
  9.  
  10. for i in range (FIL-1, FIL+2, 1):
  11.    for j in range (COL-1, COL+2, 1):
  12.        if i == FIL and j == COL:
  13.            continue
  14.        if i == len(M) or j == len(M[i]):
  15.            break
  16.        if i >= 0 and j >= 0:
  17.            L.append(M[i][j])
  18.  
  19. return sum(L)
  20.  
  21. L = [
  22.     [1,2,3],
  23.     [2,4,7],
  24.     [5,6,7]
  25.    ]
  26.  
  27. SumaVecinos(L, 1, 0)
  28.  
  29. #Resultado: 18

Muchas gracias por la colaboración.

PD: Para pulirlo he tenido que añadir las sentencias break y continue que me permiten moverme libremente por dentro de un bucle.


Título: Re: [Python] Sumatorio de elementos adyacentes en una matriz [SOLUCIONADO]
Publicado por: MCKSys Argentina en 14 Marzo 2013, 23:27 pm
Muchas gracias por la colaboración.

No hay por dónde!  ;D

Quizá tengas razón pero a mi modo de entender no es demasiado 'bonito' ese trozo de código con tantos sumandos pudiendo automatizarlo todo.

Estoy de acuerdo: sobre gustos no hay nada escrito...  :P

Pero hay algo que no haz teniendo en cuenta:

Mi codigo SIEMPRE se ejecutara a igual velocidad. Ya sea en una matriz de 3x3 como en una de NxN.

Solo para hacer pruebas, intenta definir la funcion usando el algoritmo que expuse y haz pruebas con matrices grandes. Veras que los resultados varian bastante.  ;)

En fin, creo que el problema esta solucionado y, mejor aún, que haz descubierto la forma de hacerlo tu mismo.

Y esa es la mejor forma de hacer las cosas, segun lo veo, pues haces y aprendes en el camino.

Saludos!