Autor
|
Tema: [Python] Sumatorio de elementos adyacentes en una matriz [SOLUCIONADO] (Leído 10,475 veces)
|
eLank0
eLhAcKeR r00Lz
Desconectado
Mensajes: 1.062
|
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: L = [ [1,2,3], [2,4,7], [5,6,7] ] L2 = [ [0,0,0], [0,0,0], [0,0,0] ] for i_rows in range(0,len(L)): for i_cols in range(len(L[i_rows])): for i in range(i_rows-1, i_rows+1): for j in range(i_cols-1, i_cols+1): if i_cols >= 0 and i_rows >= 0: L2[i_rows][i_cols] += L[i][j] print(L2[0]) print(L2[1]) print(L2[2])
Espero que me echen una mano, únicamente me gustaría un poco de información para codificar correctamente el algoritmo. Gracias.
|
|
« Última modificación: 14 Marzo 2013, 23:19 pm por eLank0 »
|
En línea
|
|
|
|
eLank0
eLhAcKeR r00Lz
Desconectado
Mensajes: 1.062
|
Hola de nuevo, Os publicaré los avances que he hecho. Ahora ya consigo recorrer correctamente los elementos adyacentes a mi elemento parámetro: L = [ [1,2,3], [2,4,7], [5,6,7] ] L2 = [] #Buscamos los vecinos de la posición L[1, 0] a = 1 b = 0 for i in range (a-1, a+2, 1): for j in range (b-1, b+2, 1): if i >= 0 and j >= 0: print(L[i][j]) #for item in L2: #print(item, end=' ')
La salida de este código es: 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:
if i is not a and j is not b: 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.
|
|
« Última modificación: 14 Marzo 2013, 00:42 am por eLank0 »
|
En línea
|
|
|
|
Danyfirex
Desconectado
Mensajes: 493
My Dear Mizuho
|
no entiendo a que sumatoria. explícate.
a que sumatoria te refieres?
|
|
« Última modificación: 14 Marzo 2013, 01:04 am por Danyfirex »
|
En línea
|
|
|
|
eLank0
eLhAcKeR r00Lz
Desconectado
Mensajes: 1.062
|
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.
|
|
|
En línea
|
|
|
|
MCKSys Argentina
|
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... Saludos!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
eLank0
eLhAcKeR r00Lz
Desconectado
Mensajes: 1.062
|
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.
|
|
« Última modificación: 14 Marzo 2013, 19:47 pm por eLank0 »
|
En línea
|
|
|
|
MCKSys Argentina
|
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!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
eLank0
eLhAcKeR r00Lz
Desconectado
Mensajes: 1.062
|
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: def SumaVecinos(M, FIL, COL): ''' (int, int) -> int Realiza el sumatorio de los elementos adyacentes al elemento [FIL][COL] de la matriz M. ''' L = [] for i in range (FIL-1, FIL+2, 1): for j in range (COL-1, COL+2, 1): if i == FIL and j == COL: continue if i == len(M) or j == len(M[i]): break if i >= 0 and j >= 0: L.append(M[i][j]) return sum(L) L = [ [1,2,3], [2,4,7], [5,6,7] ] SumaVecinos(L, 1, 0) #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.
|
|
« Última modificación: 14 Marzo 2013, 23:21 pm por eLank0 »
|
En línea
|
|
|
|
MCKSys Argentina
|
Muchas gracias por la colaboración.
No hay por dónde! 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... 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!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Python]Ir añadiendo elementos a una tabla
« 1 2 »
Scripting
|
Debci
|
10
|
6,310
|
2 Mayo 2010, 00:53 am
por leogtz
|
|
|
Intercambiar elementos de lugar en una matriz
Programación C/C++
|
binaryum
|
4
|
8,483
|
25 Julio 2010, 22:15 pm
por mk_137
|
|
|
multiplicar los elementos de una fila en python
Dudas Generales
|
Matinegro
|
6
|
5,222
|
11 Noviembre 2013, 21:52 pm
por Matinegro
|
|
|
Duda del desplazamiento de los elementos de una matriz(norte,sur,este,oeste)
Programación C/C++
|
xuhipoint
|
3
|
6,275
|
14 Mayo 2014, 18:21 pm
por Blaster
|
|
|
Problema con mostrar elementos de la matriz
Programación C/C++
|
Rhythmical
|
2
|
2,713
|
10 Septiembre 2017, 18:21 pm
por Rhythmical
|
|