elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


  Mostrar Mensajes
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13
1  Programación / Scripting / Re: Encencer y apagar un Led con Python en: 23 Julio 2017, 03:31
Con gusto bro, cualquier duda no dudes en preguntar.

Saludos.
2  Programación / Scripting / Re: Encencer y apagar un Led con Python en: 22 Julio 2017, 20:21
Brother, te estás ahogando en un vaso de agua, PySerial está tanto para Python2 como para Python 3 (https://pypi.python.org/pypi/pyserial/3.3)y la sintaxis es la misma.

La documentación la tienes acá: http://pyserial.readthedocs.io/en/latest/shortintro.html

Cuando tengas la apliación corriendo en la consola, perocupate por la interfaz gráfica.

Saludos!
3  Programación / Scripting / Re: Encencer y apagar un Led con Python en: 20 Julio 2017, 17:50
Solucionado el problema con el enlace.

El script en la terminal no debería ser un problema,
ahora, la interfaz gráfica, puede ser complicada al principio, igual QT cuenta con un diseñador (Qt Designer) y GTK con Glade que te ahorran muchas complicaciones.

Saludos!
4  Programación / Scripting / Re: Encencer y apagar un Led con Python en: 19 Julio 2017, 17:11
Hola Meta por lo que veo ya tienes todos los conceptos, lo único que necesitas en Python es la comunicación serial que la puedes conseguir con la libreria pyserial si, además quieres hacer la interfaz gráfica, en Python tienes un montón de opciones, pero te recomiendo PyQT (acá tienes una lista completa de las librerias https://wiki.python.org/moin/GuiProgramming )

Saludos!
5  Programación / Scripting / Introducción a NumPy en: 12 Julio 2017, 13:25
Fuente: http://elblogdeonce.blogspot.com.co/2017/07/parte-iii-vision-artificial.html


Aunque en la entrada anterior ([Parte II: visión artificial] Primeros pasos con OpenCV y Numpy) se habló un poco sobre numpy éste se merece una entrada completa (y más) debido a que el corazón de la visión artificial son las operaciones matriciales lo que hace de numpy una parte imprescindible incluso cuando usamos librerias que hacen gran parte del trabajo como OpenCV. El objetivo de ésta entrada es familiarizarnos un poco más con NumPy y así poder dejar sentado el terreno para comenzar a hacer visión artificial.

¿Cómo recorrer una matriz?
Uno de los principales problemas/confusiones que he notado es a la hora de recorrer una matriz. La confusión es simple, suelen tratar a las matices como sistemas coordenados...

Figura: estructura de una matriz.

Por convención a cada sección horizontal de la matriz la llamamos una fila (verde) y a cada sección vertical una columna (azul). Además, la numeración de las filas y columnas comienza desde la esquina superior izquierda (el origen), las filas crecen hacía abajo y las columnas hacía la derecha.

Para acceder a un elemento, se debe especificar la fila y la columna (generalmente en ese orden exacto) donde se encuentra el elemento.

Y acá está el problema, cuando accedemos a un elemento de una matriz lo hacemos mediante dos coordenadas (fila, columna) por lo que debemos tener en cuenta que las filas nos mueven por la matriz verticalmente y que las columnas nos mueven por la matriz horizontalmente. Contrario a como nos movemos en un sistema coordenado donde por lo general la primer componente nos mueve horizontalmente (el eje de las x), y la segunda verticalmente (el eje de las y).

Tener esto en cuenta nos va a ahora MUCHOS dolores de cabeza en un futuro.

¿Cómo crear una matriz?

Numpy nos proporciona varios métodos para crear matrices:

A partir de una lista
Para crear una matriz a partir de una lista tenemos el método numpy.array() que recibe como parametro una lista (que puede ser una lista de lista en el caso de las matrices)

Código
  1. >>> import numpy as np
  2. >>> x = np.array([1, 2, 3])  # Vector
  3. >>> x
  4. array([1, 2, 3])
  5. >>> X = np.array([[1, 2, 3], [4, 5, 6]])  # Matriz 2x3
  6. >>> X
  7. array([[1, 2, 3],
  8.       [4, 5, 6]])

Métodos predefinidos
Numpy también nos proporciona unos métodos predefinidos para crear matrices, por ejemplo la matriz identidad, matrices de unos o de ceros:

Código
  1. >>> import numpy as np
  2. >>> identidad = np.identity(3)
  3. >>> identidad
  4. array([[ 1.,  0.,  0.],
  5.       [ 0.,  1.,  0.],
  6.       [ 0.,  0.,  1.]])
  7. >>> ceros = np.zeros((3, 3))
  8. >>> ceros
  9. array([[ 0.,  0.,  0.],
  10.       [ 0.,  0.,  0.],
  11.       [ 0.,  0.,  0.]])
  12. >>> unos = np.ones((3, 3))
  13. >>> unos
  14. array([[ 1.,  1.,  1.],
  15.       [ 1.,  1.,  1.],
  16.       [ 1.,  1.,  1.]])

El método numpy.identity(n) genera la matriz identidad de dimensiones nxn
Los métodos numpy.zeros(tamaño), numpy.ones(tamaño) crean matrices de ceros y unos respectivamente.

¿Operaciones con matrices?
Una de las cosas que más conmociona a las personas cuando se enfrentan por primer vez con numpy es que éste usa los mismos operadores de Python.
Así que veamos un repaso de éstos operadores:


Operador   Uso   Operación
+   a + b   Suma
-   a - b   Resta
*   a * b   Multiplicación
/   a / b   División
//   a // b   División entera
**   a ** b   Potencia
%   a % b   Módulo
<   a < b   Menor que
<=   a <= b   Menor o igual que
==   a == b   Igualdad
>   a > b   Mayor que
>=   a >= b   Mayor o igual que
!=   a != b   Distinto

Éstos son sólo algunos de los operadores de Python que además podemos usar con objetos de numpy. Esto se logra sobreescribiendo los operadores (algo de lo que hablaremos luego en una entrada aparte).

Hay dos cosas que debemos tener en cuenta:

  • Al menos uno de los operandos debe ser un objeto numpy: Así es, no es necesario que los dos operandos sean objetos de numpy, basta con se sólo a, o sólo b sean objetos de numpy para que se pueda realizar la operación sin errores.
  • Éstas operaciones son elemento a elemento: Acá tenemos dos casos:
    • Tanto a como b son objetos de numpy: En este caso, las operaciones se realizan elemento a elemento, es decir, el primero de a con el primero de b, el segundo de a con el segundo de b... por lo que debemos tener en cuenta que tanto a, como b deben tener las mismas dimensiones.
    • Hay un objeto de numpy y un número: En este caso, se aplica la operación deseada a toda la matriz con el número indicado.
      El resultado va a ser una nueva matriz con el resultado de aplicar la operación indicada.


Si queremos la multiplicación habitual de matrices, a partir de Python 3.5 se introdujo el operador @ (PEP 465) que nos permite justo eso, realizar la multiplicación "real" entre matrices.

Un pequeño ejemplo
Código
  1. >>> import numpy as np
  2. >>> a = np.ones((3, 3))  # Crea una matriz de unos 3x3
  3. >>> a
  4. array([[ 1.,  1.,  1.],
  5.       [ 1.,  1.,  1.],
  6.       [ 1.,  1.,  1.]])
  7. >>> a = a * 2  # Multiplica cada componente de a por 2
  8. >>> a
  9. array([[ 2.,  2.,  2.],
  10.       [ 2.,  2.,  2.],
  11.       [ 2.,  2.,  2.]])
  12. >>> b = np.ones((3, 3)) ** 5  # Eleva cada componente a la quintapotencia
  13. >>> b
  14. array([[ 1.,  1.,  1.],
  15.       [ 1.,  1.,  1.],
  16.       [ 1.,  1.,  1.]])
  17. >>> b = b + 5  # Suma a cada componente de b 5
  18. >>> b
  19. array([[ 6.,  6.,  6.],
  20.       [ 6.,  6.,  6.],
  21.       [ 6.,  6.,  6.]])
  22. >>> a @ b  # Multiplicación matricial entre a y b
  23. array([[ 36.,  36.,  36.],
  24.       [ 36.,  36.,  36.],
  25.       [ 36.,  36.,  36.]])
  26. >>> b > 5  # Componentes mayores que 5
  27. array([[ True,  True,  True],
  28.       [ True,  True,  True],
  29.       [ True,  True,  True]], dtype=bool)
  30. >>> b < 3  # Componentes menores que 3
  31. array([[False, False, False],
  32.       [False, False, False],
  33.       [False, False, False]], dtype=bool)
  34. >>>

Indexing y slicing
Al igual que las lista en Python, los objetos de numpy también soportan tanto el indexing, como el slicing.

Indexing
El indexing nos permite acceder a un elemento indicando sus coordenadas.

Si estamos trabajando con un vector (matriz con solo una columna o solo una fila) para acceder a un elemento sólo necesitamos su índice:
Código
  1. >>> import numpy as np
  2. >>> x = np.array([1, 2, 3])
  3. >>> x[0]
  4. 1
  5. >>> x[1]
  6. 2
  7. >>> x[-1]
  8. 3
  9. >>>

El indexing para vectores funciona igual que para listas.

Si estamos trabajando con matrices, para acceder a un elemento, necesitamos dos coordenadas (a veces tres) la fila y la columna donde se encuentra el elemento que necesitamos:

Código
  1. >>> import numpy as np
  2. >>> a = np.identity(3)
  3. >>> a
  4. array([[ 1.,  0.,  0.],
  5.       [ 0.,  1.,  0.],
  6.       [ 0.,  0.,  1.]])
  7. >>> a[1, 1]
  8. 1.0
  9. >>> a[1,-1]
  10. 0.0
  11. >>> a[0,0]
  12. 1.0

Los índices negativos seleccionan un elemento comenzando desde el final del array, siendo -1 la posición del último elemento, -2 la del penultimo y así...

Es por eso que en el caso del array, x[-1] devuelve 3 ya que este es el último elemento del array; y en el caso de la matriz, a[1, -1] devuelve 0.0 ya que éste es el elemento que se encuentra en la primer fila y en la última columna.

Slicing
El slicing es una variación del indexing en la que en lugar de obtener un solo elemento, nos permite obtener un rango de elementos.

La sintaxis es igual a la del slicing para listas:
Código
  1. >>> import numpy as np
  2. >>> x = np.arange(10)
  3. >>> x
  4. array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
  5. >>> x[:5]
  6. array([0, 1, 2, 3, 4])
  7. >>> x[5:]
  8. array([5, 6, 7, 8, 9])
  9. >>> x[-1:0:-1]
  10. array([9, 8, 7, 6, 5, 4, 3, 2, 1])
  11. >>> x[-1:0:-2]
  12. array([9, 7, 5, 3, 1])

Se indica el rango que se quiere obtener usando a:b (dos puntos) donde tanto a como b son enteros. a indica el inicio, si se omite, se toma 0 y b indica el final, si se omite, se toma -1.

Hay que tener en cuenta que el rango que devuelve el slicing va desde a hasta  b - 1.

Además, hay un tercer parámetro opcional, también separado por : (dos puntos) que indica el paso (o salto).

Para las matrices la sintaxis es la misma, solo que debemos hacer el slicing tanto para las filas como para las columnas, separadas por una , (coma):


Código
  1. >>> import numpy as np
  2. >>> a = np.identity(3)
  3. >>> a
  4. array([[ 1.,  0.,  0.],
  5.       [ 0.,  1.,  0.],
  6.       [ 0.,  0.,  1.]])
  7. >>> a[1:, 1:]
  8. array([[ 1.,  0.],
  9.       [ 0.,  1.]])
  10. >>> a[:1, :1]
  11. array([[ 1.]])
  12. >>> a[:2, :2]
  13. array([[ 1.,  0.],
  14.       [ 0.,  1.]])
  15. >>>

Estos son solo ejemplos de indexing y slicing básicos, para ver operaciones más avanzadas y aclarar posibles dudas, referirse a la documentación oficial


Modificar los valores de una matriz
Para modificar los valores de una matriz podemos hacerlo de a un solo elemento usando indexing, o de a varios elementos usando slicing.

Eso sí, siempre debemos tener en cuenta el tamaño de los datos que queremos escribir coincidan con el tamaño seleccionado en la matriz de destino.

Código
  1. >>> import numpy as np
  2. >>> a = np.identity(3)
  3. >>> a
  4. array([[ 1.,  0.,  0.],
  5.       [ 0.,  1.,  0.],
  6.       [ 0.,  0.,  1.]])
  7. >>> a[1, 1] = 10
  8. >>> a
  9. array([[  1.,   0.,   0.],
  10.       [  0.,  10.,   0.],
  11.       [  0.,   0.,   1.]])
  12. >>> a[1:, 1:] = np.ones((3, 3))
  13. Traceback (most recent call last):
  14.  File "", line 1, in
  15. ValueError: could not broadcast input array from shape (3,3) into shape (2,2)
  16. >>> a[1:, 1:] = np.ones((2, 2))
  17. >>> a
  18. array([[ 1.,  0.,  0.],
  19.       [ 0.,  1.,  1.],
  20.       [ 0.,  1.,  1.]])

En éste caso, en la línea 12 ocurre un error porque estamos intentando asignar una matriz 3x3 a una zona de la matriz a de tamaño 2x2.

Uso de máscaras
Otra forma de modificar los elementos de una matriz es mediante el uso de máscaras.

Una máscara es una matriz booleana (de falsos y verdaderos) donde las componentes verdaderas indican los elementos que van a ser modificados.

La máscara se pasa como si ésta fuera un índice:

Código
  1. >>> x = np.arange(25)  # Crea un vector
  2. >>> X = x.reshape(5, 5)  # Convierte el vector a matriz de 5x5
  3. >>> X
  4. array([[ 0,  1,  2,  3,  4],
  5.       [ 5,  6,  7,  8,  9],
  6.       [10, 11, 12, 13, 14],
  7.       [15, 16, 17, 18, 19],
  8.       [20, 21, 22, 23, 24]])
  9. >>> mascara = (X % 2 == 0)  # Genera máscara posición de los elementos pares
  10. >>> mascara
  11. array([[ True, False,  True, False,  True],
  12.       [False,  True, False,  True, False],
  13.       [ True, False,  True, False,  True],
  14.       [False,  True, False,  True, False],
  15.       [ True, False,  True, False,  True]], dtype=bool)
  16. >>> X[mascara] = 0  # Cambia todos los pares por cero
  17. >>> X
  18. array([[ 0,  1,  0,  3,  0],
  19.       [ 5,  0,  7,  0,  9],
  20.       [ 0, 11,  0, 13,  0],
  21.       [15,  0, 17,  0, 19],
  22.       [ 0, 21,  0, 23,  0]])

¿Paso de matrices como valor o referencia?
Otro de los inconvenientes (más que inconveniente es un dolor de trasero) en especial para quien apenas está comenzando con Python e incluso para los distraidos es que, a veces, despues de llamar a una función y de pasarle a esta una matriz sobre la que realizaremos una operación suceden cosas extrañas. (brujería podrian pensar algunos) y el culpable está en como Python pasa los parametros por valor y por referencia.

Parametros por valor
Decimos que un parametro se pasa por valor cuando a una función se le pasa el valor (valga la redundancia) de una variable, o en otras palabras, una copia de una variable. Por lo tanto los cambios que se hagan sobre este parametro se hacen sobre la copia.

Parametros por referencia
Decimos que un parametro se pasa por referencia cuando a una función se le pasa la dirección en memoria de una variable en lugar de una copia de la variable. Por lo tanto los cambios que se hagan sobre este parametro, se hacen en la dirección de memoria a la que apunta y por lo tanto se hacen sobre la variable original.


Teniendo ésto en cuenta, ahora debemos comprender como toma Python los parametros por valor y por referencia.

Parametros por valor y referencia en Python
A Python no podemos especificarle explícitamente que valores queremos pasar por valor y cuales por referencia, en su lugar debemos recordar:

Los objetos mutables se pasan por referencia.
Los objetos inmutables se pasan por valor.

Los objetos mutables son aquellos que pueden cambiar su valor.
Los objetos inmutables son aquellos que no pueden cambiar su valor.

Aunque ésta definición no está completa (no es el objetivo de la entrada) es suficiente para comprender la "magía negra" que está por ocurrir. (Eso sí, teniendo en cuenta que las matrices de numpy son objetos mutables).

Código
  1. import numpy as np
  2.  
  3. def funcion(matriz):
  4.    matriz[1, 1] = 10
  5.  
  6. mi_matriz = np.ones((3, 3))
  7. print("Antes de llamar la función:")
  8. print(mi_matriz)
  9. funcion(mi_matriz)
  10. print("Después de llamar la función:")
  11. print(mi_matriz)

Citar
Antes de llamar la función:
[[ 1.  1.  1.]
 [ 1.  1.  1.]
 [ 1.  1.  1.]]
Después de llamar la función:
[[  1.   1.   1.]
 [  1.  10.   1.]
 [  1.   1.   1.]]

Ésto significa que los cambios que realizamos a la matriz (incluso con distinto nombre) dentro de la función son visibles (afectan a la variable fuera de la función) fuera de la función.

Si no queremos que esto suceda debemos crear explícitamente una copia de la matriz y pasar a la función ésta copia en lugar de la matriz original.

Para copiar una matriz, podemos hacer uso del método copy() que tienen los objetos de numpy:

Código
  1. import numpy as np
  2.  
  3. def funcion(matriz):
  4.    matriz[1, 1] = 10
  5.  
  6. mi_matriz = np.ones((3, 3))
  7. print("Antes de llamar la función:")
  8. print(mi_matriz)
  9. funcion(mi_matriz.copy())
  10. print("Después de llamar la función:")
  11. print(mi_matriz)

Citar
Antes de llamar la función:
[[ 1.  1.  1.]
 [ 1.  1.  1.]
 [ 1.  1.  1.]]
Después de llamar la función:
[[  1.   1.   1.]
 [  1.   1.   1.]
 [  1.   1.   1.]]

Ésta vez pasamos una copia de la matriz y no la matriz como tal, por lo que aunque se sigue pasando la copia de la matriz por referencia se está modificando la copia pero no la original.

Algunos métodos interesantes de numpy
numpy.amin(matriz): Devuelve el menor elemento de la matriz.
numpy.amax(matriz): Devuelve el mayor elemento de la matriz.
numpy.arange(matriz): Similar a range()
numpy.sum(matriz): Suma todos los elementos de la matriz.

Algunos métodos de las matrices (objetos ndarray)
matriz.ravel(): Devuelve un vector con los elementos de la matriz.
matriz.copy(): Copia la matriz.
matriz.reshape(tamaño): Cambia el tamaño de la matriz.

Referirse a la documentación para una lista completa de los métodos y propiedades: ir

Saludos!
Once.
6  Programación / Scripting / Re: Python ordenamiento a la hora de impresion en: 23 Mayo 2017, 06:55
En ese caso, no te sirve formatear antes de agregar la información al archivo, ya que no sabes que información va a ir a continuación. (Por eso en el ejemplo que te puse arriba, necesitabas la lista con la info [bcompleta[/b])

Para solucionarlo en tu caso, tendrías que, cada tanto, estar abriendo el archivo, leer la información que está ahí, formatearla y guardar de nuevo la información ya formateada en el archivo.

Ahora, para saber si la cadena se pasa de una cantidad de caracteres específica, usa la función len(cadena) y un condicional, para agregar una nueva línea, lo puedes hacer imprimiendo: "\r\n"

Saludos.
7  Programación / Scripting / Re: Python ordenamiento a la hora de impresion en: 21 Mayo 2017, 05:43
Así por encima, loq ue se me ocurre que puedes hacer es, no guardar los datos en el archivo de texto sino hasta que ya los tengas todos recolectados, éstos los vas guardando (puede ser en listas) y una vez tienes los datos guardados, buscas en las listas los que tienen mayor longitud y usas ese dato para generar la cantidad de espacios que separen cada columna.


Edit: No creo que me explicara muy bien, así que te dejo este ejemplo (fue lo primero que se me ocurió) sólo adáptalo a tu necesidad.

Código
  1. columna_uno = ["hola", "soy", "Once"]
  2. columna_dos = ["Esta", "es", "una"]
  3.  
  4. max_columna_uno = max(map(len, columna_uno))
  5. max_columna_dos = max(map(len, columna_dos))
  6.  
  7. for e1, e2 in zip(columna_uno, columna_dos):
  8.    print("|{0}|{1}|".format(e1.ljust(max_columna_uno + 1), e2.ljust(max_columna_dos + 1)))
  9.  



El resultado es algo así:


Saludos.
8  Programación / Scripting / Re: Ver todos los archivos y extraerlos con python en: 24 Abril 2017, 07:27
Hola, ya te respondieron los compañeros, pero ya alguna vez hice algo parecido para pasar los archivos entre la tablet y el pc sin necesidad de usar un FTP, solo por programar.

Así que te aconsejo, si quieres programar todo tu mismo que mires la libreria Pickle que te permite serializar objetos (pasarlos a cadenas de textos que puedes transmitir y luego pasarlos de nuevo al objeto original) y a la libreria socket para enviarse los archivos

Lo que hice yo fue pedir al otro computador la lista de los archivos en una determinada carpeta (puedes usar la librería glob o la libreria os) enviaba esta lista serializa por sockets a mi máquina.

Saludos!
9  Programación / Scripting / Re: Python3 Pyqt OpenCV en MAC en: 24 Abril 2017, 07:21
Hola, sé que OpenCV debe ser instalado con brew porque se necesitan los compilados (que Brew instala pero pip no), lo que no sabía era que también era necesario instalar Python con brew. con PyQT no tengo ni idea, ahí no te puedo ayudar.

Con respecto a IDLE, fíjate si lo instala pero no te está creando los accesos directos (que es lo que pasa en Linux) (necesitas tener instalada la libreria tkinter) solo ejecuta en una terminal idle, idle2 o idle3 dependiendo de la versión de Python que quieras cargar. Si no funciona, busca que justo como cualquier otra aplicación, el IDLE se puede instalar sin problemas como un programa normal (aunque no sé cómo hacerlo en MAC)


Edito: Acá tienes la documentación de IDLE https://docs.python.org/3/library/idle.html

Y acá tienes el código fuente:
https://github.com/python/cpython/tree/3.6/Lib/idlelib/

Además, acá hablan sobre el IDLE en MAC
https://www.python.org/download/mac/tcltk/

Espero te sirva.


Saludos!
10  Programación / Scripting / Re: [Error][Python] No module named bluetooth._bluetooth en: 22 Abril 2017, 04:43
Una pregunta, las librerias estas (que no las conozco) las estás instalando o solo las descargas y las pones ahí?

Saludos!
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines