Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Meta en 14 Noviembre 2010, 06:24 am



Título: [Python] - Matrices.
Publicado por: Meta en 14 Noviembre 2010, 06:24 am
He llegado un poco el tema de las matrices a ver como es.

Ver ejercicios. (http://www.subeimagenes.com/img/wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww-6848.jpg)

Página 196 de este docuemnto PDF. http://marmota.act.uji.es/mtp/pdf/python.pdf

La verdad que no entiendo ni papa.


Título: Re: [Python] - Matrices.
Publicado por: Karcrack en 14 Noviembre 2010, 11:31 am
Necesitas conocimientos sobre matrices.. la matriz identidad es la que tiene todo 0 menos la diagonal que son 1...
(http://upload.wikimedia.org/math/d/5/f/d5f8283d3c366215dd5ae1c737dfe127.png)
Código:
http://es.wikipedia.org/wiki/Matriz_identidad
Lo que te pide este ejercicio es que a partir de n saques la matriz Identidad de orden nxn


Título: Re: [Python] - Matrices.
Publicado por: Meta en 14 Noviembre 2010, 16:43 pm
Intenté hacer algo como esto:

Código
  1. n = int(raw_input('Introduce un entero positivo: '))
  2.  
  3. M = []
  4. for i in range(n):
  5.    M.append( [0] * n )
  6.    print M
  7.  
  8. M [0] [0] = 1
  9. print M

Su resultado fue:
Citar
Introduce un entero positivo: 6
[[0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
[[1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]

Menudo disparate.


Título: Re: [Python] - Matrices.
Publicado por: Karcrack en 14 Noviembre 2010, 18:38 pm
Yo lo haria asi:
Código
  1. while True:
  2.    try:
  3.        n = int(raw_input("[!]Introduce el orden de la matrix: "))
  4.        break;
  5.    except:
  6.        print "[X]Formato incorrecto."
  7.  
  8. M = []
  9. for i in range(n):
  10.    a = [0] * n
  11.    a[i] = 1
  12.    print a         ## Simplemente para mostrarla, en realidad no se ha de mostrar
  13.    M.append(a)


Título: Re: [Python] - Matrices.
Publicado por: Meta en 14 Noviembre 2010, 20:05 pm
Me funciona.

Lo hiciste de una manera impresionante hasta el resultado.

Muchuas gracias.


Título: Re: [Python] - Matrices.
Publicado por: Karcrack en 14 Noviembre 2010, 20:07 pm
De nada, pero para la proxima tal vez debas dedicarle mas tiempo a un mismo ejercicio, consiguiendolo por ti mismo aprenderas de una forma mas completa ;)


Título: Re: [Python] - Matrices.
Publicado por: Meta en 15 Noviembre 2010, 04:06 am
Si, será eso.
Debo leer y leer más el PDF, porque me olvido con facilidad lo aprendido en el pasado.

También a dedicarme hacer más algorito a mano para luego adaptarlo a programación.

La verda que me cuesta mucho programación yo solo sin profesor ni nada, sólo autodidacta y con el PDF que aparece en mi firma. Desde que coja el truco lo justo me paso a otra lengua a ver que tal.


Título: Re: [Python] - Matrices.
Publicado por: Gabriela en 16 Noviembre 2010, 12:51 pm
Pues sí, del mismo PDF que tú llegue a finalizar el capitulo 4 , pero necesariamente debí hacer un stop, y regresar al dos, porque por ausencia de más práctica me olvido. Salvo los ejercicios muy simples, cuando repito los ejercicios, he programado códigos diferentes.

Si te digo, que en un código asigné a una variable tal.. y tal. Estuve más de una hora porque al ejecutarlo  me había equivocado en el nombre de la variable ( error ortográfico) y dale que dale Pyn marcandome error en el mismo lugar. Hasta que me di cuenta de lo que era ( una reverenda tontería) pues pillé buen cabreo.

La variable la llame prEmedio
Y luego al llamarla la llamaba prOmedio. Pues por raro que parezca y debido que no leemos letra a letra, sino el conjunto de significación, ahí estuve fastididada.

Pero nada de decaer, que Pyn es "adorable".

Gabriela.


Título: Re: [Python] - Matrices.
Publicado por: Novlucker en 16 Noviembre 2010, 13:07 pm
Como hacer el código de karcrack más ilegible? :D
Código
  1. while True:
  2.    try:
  3.        n = input("[!]Introduce el orden de la matrix: ")
  4.        break;
  5.    except:
  6.        print "[X]Formato incorrecto."
  7.  
  8. M = [[int(i==e) for i in range(n)] for e in range(n)]
  9. print M

Saludos


Título: Re: [Python] - Matrices.
Publicado por: Karcrack en 16 Noviembre 2010, 17:05 pm
Bonita forma de complicar las cosas Novlucker :laugh:
Pero si no me equivoco con tu metodo de todo-apretado-en-una-linea ( :xD) se hacen el doble de 'vueltas'.. es decir, tu usas un for de mas, para comprobar si es la diagonal... Me equivoco?


Título: Re: [Python] - Matrices.
Publicado por: Novlucker en 16 Noviembre 2010, 17:23 pm
De hecho no, es que en mi caso no uso append para generar la lista, sino que la genero dinamicamnte con un for.

El primer for genera una lista de n elementos, y el for de afuera crea n listas (matriz n x n). La diagonal la defino con esa única comparación i==e :D

Saludos


Título: Re: [Python] - Matrices.
Publicado por: Meta en 16 Noviembre 2010, 17:29 pm
Que interés, que fuerza, que motivación, que ilusión, que grandeza, qué ánimos, qué energía...
veo mucha profesionalidad aquí dentro.

¿Se puede hacer sencillo de entender?



Título: Re: [Python] - Matrices.
Publicado por: Karcrack en 16 Noviembre 2010, 17:37 pm
De hecho no, es que en mi caso no uso append para generar la lista, sino que la genero dinamicamnte con un for.

El primer for genera una lista de n elementos, y el for de afuera crea n listas (matriz n x n). La diagonal la defino con esa única comparación i==e :D

Saludos
Entonces si que se hacen dos for, no? :xD


Título: Re: [Python] - Matrices.
Publicado por: Novlucker en 16 Noviembre 2010, 17:41 pm
Ya ya, pero a lo que voy es que no son más vueltas :xD y lo de la diagonal es la comparación :P
[Edito]:
Ahora si por si acaso, medido el tiempo con timeit para n = 10 y 1000 repeticiones de la función (obviamente he quitado el input)

Karcrack = 23.4203746812
Novlucker = 6.43258395027 :D

Saludos


Título: Re: [Python] - Matrices.
Publicado por: Karcrack en 16 Noviembre 2010, 17:58 pm
Novlucker, podrais postear exactamente el codigo que has utilizado para medir el tiempo con timeit? asi puedo mejorar mis marcas :D


Título: Re: [Python] - Matrices.
Publicado por: Novlucker en 16 Noviembre 2010, 18:06 pm
Este ...
Código
  1. import timeit
  2. def test():
  3.    n = 10
  4.    M = []
  5.    for i in range(n):
  6.        a = [0] * n
  7.        a[i] = 1
  8.        print a
  9.        M.append(a)
  10.  
  11. if __name__=='__main__':
  12.    from timeit import Timer
  13.    t = Timer("test()", "from __main__ import test")
  14.    print t.timeit(1000)

... pero, le he quitado los comentarios y ha bajado 8 segundos? :huh: Igual ahora lo repetí 4 veces y da 16/17.

Ahí lo único que haces es cambiar lo que está en la función test, que para el caso de mi código no es más que poner las líneas de la creación de la lista M y el print :P

Saludos


Título: Re: [Python] - Matrices.
Publicado por: Karcrack en 16 Noviembre 2010, 19:34 pm
Pues te gano yo quitando los prints :P
Código
  1. import timeit
  2. def test1():
  3.    n = 10
  4.    M = [[int(i==e) for i in range(n)] for e in range(n)]
  5. def test2():
  6.    n = 10
  7.    M = []
  8.    for i in range(n):
  9.        a = [0] * n
  10.        a[i] = 1
  11.        M.append(a)
  12.  
  13. if __name__=='__main__':
  14.    from timeit import Timer
  15.    t = Timer("test1()", "from __main__ import test1")
  16.    print t.timeit(10000), "->Novlucker"
  17.    t = Timer("test2()", "from __main__ import test2")
  18.    print t.timeit(10000), "->Karcrack"
Tienes que tener en cuenta que yo llamo a print() n veces, y tu solo una... :P

Lo he ejecutado 10 veces y mira los resultados:
Código:
1.05840686456 ->Novlucker
0.208165562942 ->Karcrack
1.00837229313 ->Novlucker
0.21114219824 ->Karcrack
0.989414576434 ->Novlucker
0.205958299169 ->Karcrack
0.987928354023 ->Novlucker
0.208567848707 ->Karcrack
0.993568176961 ->Novlucker
0.210146820336 ->Karcrack
0.980355603855 ->Novlucker
0.204104990997 ->Karcrack
0.984192963072 ->Novlucker
0.205497626095 ->Karcrack
0.981901331035 ->Novlucker
0.203624203635 ->Karcrack
0.982219807266 ->Novlucker
0.2067748834 ->Karcrack
0.98221617552 ->Novlucker
0.283576264581 ->Karcrack
Mi codigo es aproximadamente 5 veces mas rapido :D


MOD: He hecho una version ligeramente mas rapida :)
Código
  1.    n = 10
  2.    M = [[0]*n for i in range(n)]
  3.    while n:
  4.        n-=1
  5.        M[n][n] = 1


Título: Re: [Python] - Matrices.
Publicado por: Novlucker en 16 Noviembre 2010, 20:04 pm
Pues si :P
Supongo que pesa la comparación que hago para determinar la diagonal, y que tu clonas la lista y yo la genero :P
Es decir, tu creas la lista con valores por defecto y la modificas, yo hago las verificaciones antes de crearla, pero obviamente termina siendo más ligero :xD

Saludos