Manual Python para Desmemoriados PDF
Manual Python para Desmemoriados PDF
DE GNURADIO
10. Gráficas
10.1. Trucos de matplotlib.pyplot en 2D
10.2. Trucos matplotlib para gráficas en 3D
pip list
Es para tener un listado de librerias instaladas en python
pip -V
Revisar la version de pip
2.4. Actualizaciones
● Antes que todo es importante actualizar ubuntu así:
○ Actualizar la lista de actualizacione: sudo apt-get update
○ Actualizar todo basado en la lista anterior: sudo apt-get upgrade
uis-e3t@uise3t-HP-ProDesk-600-G4-SFF:~$
(base) uis-e3t@uise3t-HP-ProDesk-600-G4-SFF:~$
Vemos que apareció la palabra “(base)” antes que todo. Eso significa que estamos
dentro del entorno virtual llamado “base”
● Cuando uno está en un Entorno Virtual como el que crea Anaconda, todas las
aplicaciones de tu computadora funcionan como si este no existiera, excepto todo
aquello relacionado con python y todas las herramientas que acompañan a
Anaconda. Es decir, si invocas algo de lo instalado con Anaconda, se invocará lo
que hay en ese ambiente virtual y no otras versiones. Por eso, si invocas python, se
ignorará el python original de tu computadora y se usará el de Anaconda.
● En el caso de GRC de GNU Radio, este, aunque genera y corre codigo de python,
ignorará el ambiente virtual de conda, pero si tu tomas un codigo de python
generado por GRC y lo corres por tu cuenta, sin GRC, lo que estará usando será
Anaconda y probablemente no funcionará porque lo más seguro es que GNU RAdio
haya sido instalado fuera de Anaconda. Precisamente, los entornos virtuales están
hechos para separar versiones de software. Uno se pregunta: tiene sentido instalar
GNU RAdio dentro del entorno virtual que crea Anaconda? la respuesta es: si no
dependes de GRC sí es posible, recuerda que GRC ignorará lo creado por
Anaconda.
● La tercera pregunta sería: entonces cómo puede uno usar el python original. El caso
se da cuando se usa gnuradio con GRC, pues el GRC, al no pertenecer a Anaconda,
ignora el entorno virtual. Pero si uno está en el entorno virtual y corre un código de
python generado por GRC va a tener problemas, porque está usando el python de
Anaconda y este no tiene instaladas las mismas librerías que está usando GRC. Al
dia de hoy, no vemos la posibilidad de informarle a un aplicación como GRC o
cualquier otra, que debe estar amarrada a un determinado entorno virtual, de
manera que ignora su existencia. La solución es: puedes salir o entrar al entorno
virtual con los siguientes comandos:
conda deactivate: te permite salid del entorno virtual de anaconda
conda activate: te permite entrar al entorno virtual de anaconda
a = 0
def foobar():
a = a + 2
print(a)
foobar()
El código que he escrito arriba, genera el mismo error. El problema está en que en
python cuando defines (o sea asignas valor) una variable local (a la función foobar en
este caso) con un mismo nombre que una variable preexistente en un ámbito superior,
ésta última variable deja de existir dentro de la función. Por tanto, dentro de foobar "a"
no existe antes de que hagas: a = a + 2. y, claro, genera fallo. La solución es declarar
dentro de la función que "a" existe fuera:
a = 0
def foobar():
global a
a = a + 2
print(a)
foobar()
TIPS
● Aunque un módulo suele ser una biblioteca de clases, funciones, variables, en
principio un módulo puede ser cualquier archivo con código python pensado en que
pueda ser usado por otros programas.
● Al importar un módulo en python, el módulo no pasa a ser parte de nuestro código,
como ocurre en c++ cuando se usa #include. Lo que ocurre realmente es lo siguiente:
○ Nuestro programa, el que hace la importación, lo que obtiene es una dirección o
enlace sobre la ubicación del código, para facilitar su acceso.
● usted puede importar toda una librería, pero también sólo una parte de ella. Bueno,
como en realidad la importación es solo una referencia, pues lo que se hace es con el
fin de satisfacer el estilo del programador. Veamos estos dos casos
○ cuando se importa toda la librería, el uso de una función de ella se hace
escribiendo el nombre de la librería seguida de un punto y la función
import random
print(random.randrange(10))
● Ejemplo:
○ A continuación se muestra la imagen al crear un sencillo módulo. Es simplemente
un código de python que guardamos con el nombre “mod1.py”
○ Ahora, mediante un terminal Ubuntu, nos ubicamos en la carpeta donde está el
módulo, lo importamos y realizamos unos experimentos
radiogis@RadioGIS-LP-1:~/Dropbox/EnUbuntuFull/Ej/Py/modulos$ python
>>> # Veremos que “x” no se puede usar directamente, sale error, pues no es parte de nuestro código
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> #Veremos que x se puede usar si se le antepone el nombre del módulo seguido de punto
... mod1.x
24
>>> z=mod1.d
>>> print z
manana
radiogis@RadioGIS-LP-1:~/Dropbox/EnUbuntuFull/Ej/Py/modulos$ python
Python 2.7.10 (default, Oct 14 2015, 16:09:02)
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
# Ahora veremos que y se puede invocar directamente, sin hacer mención a mod1.
>>> y
[2, 4, 5, 6.7]
radiogis@radiogis01:~$ python
Python 2.7.10 (default, Oct 14 2015, 16:09:02)
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Nota: cuando son módulos mas sofisticados, como los que se crean con GNU radio, se
usa un proceso de instalación que lleva esos módulos a las bibliotecas de gnu radio, de
modo que su ubicación será conocida por python
>>> x=3+2j
>>> x
(3+2j)
Las operaciones se suma, resta, multiplaciacion se pueden realizar de manera directa, sin
importar ninguna librería.
>>> x=3+2j
>>> y=1+6j
>>> z=x+y
>>> z
(4+8j)
>>> s=x*y
>>> s
(-9+20j)
>>> w=abs(x)
>>> w
3.605551275463989
>>> f=math.atan(z)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float
>>> x=random.random()
>>> x
0.5189966910063891
>>> x=random.uniform(-1,1)
>>> x
-0.24443903208713924
>>> x=random.uniform(-1-1j,1+1j)
>>> x
(-0.573600293514859-0.573600293514859j)
## Nota: aqui pudimos obtener la amplitud que ese bloque tiene configurada, pero conocer lo que él genera
es algo mayor, quizá requiere el uso de bloques capaces de consumir esa información.
11. Gráficas
Hay varios métodos:
● usando pylab. Es lo más cercano a Matlab. El mejor tutorial es este enlace
● matplotlib. Es lo que más hemos usado hasta ahora junto con una sub librería
○ pyplot
○ Ejemplos nuestros
def grafica_3D(x,y,z):
fig=plt.figure()
ax=fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, c='y', marker='o')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
>>> # uno puede definir un vector como una tupla, con numpy se puede traducir en un numpy vector
>>> x=(1,4,5.5,6)
>>> y=numpy.array(x)
>>> y
array([ 1. , 4. , 5.5, 6. ])
>>> # Con numpy lo que se manejan son operaciones con arrays (vectoriales y matriciales)
>>> a=numpy.array([1,2,3])
>>> b=numpy.array([4,5,6])
>>> y=a+b
>>> y
array([5, 7, 9])
Ojo: lo malo de lo anterior, es que los valores que coloca no son del todo ceros. Lo mejor es
>>> min=-4
>>> max=4
>>> N=41
>>> x=numpy.linspace(min,max,N)
>>> x
array([-4. , -3.8, -3.6, -3.4, -3.2, -3. , -2.8, -2.6, -2.4, -2.2, -2. ,
-1.8, -1.6, -1.4, -1.2, -1. , -0.8, -0.6, -0.4, -0.2, 0. , 0.2,
0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4,
2.6, 2.8, 3. , 3.2, 3.4, 3.6, 3.8, 4. ])
# Esto es lo que no se debe hacer, pues lo que sale es una lista, no un vector
>>> n=range(L)
>>> n
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> n=np.arange(L)
>>> n
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# Nota: fíjese la diferencia entre lista y vector: el segundo apararece entre ([])
13.12. Llenar un array con valores de una función
Ojo: A[0:N:M] lo que significa es lo siguiente: los valores del vector, desde la celda 0 hasta
la N en pasos de M
h1=(1,1,1)
h2=(0,0)
h=h1+h2
print h
h=(1,1,1,0,0)
Pero ojo, si h1 y h2 son arrays lo que va a ocurrir es una suma punto. Entonces lo que hay
que hacer es como lo siguiente:
Se desea que x=[0, 0, 0, 0], x1=[1] y que y sea la unión osea y=[0,0,0,0,1]
import numpy as np
x=np.array(4*[0])
x1=np.array([1])
y=np.concatenate((x,x1)) #Nota: fíjese que la notación está entre dos paréntesis
Nota: Aunque la segunda opción parece la más apropiada a todas luces en gnuradio, es
importante advertir, que muchos bloques, cuando piden un valor vectorial, la opción que
brindan son tuplas. Por ejemplo, pruebe usar el bloque “vector source”, al parámentro vector
póngale (1,1)+(0,0,0), verá que el entenderá que el vector es 1,1,0,0,0
>>> x1=np.array([[2,3],[3,5]])
>>> y1=np.array([[1,2],[5,-1]])
>>> x2=np.matrix([[2,3],[3,5]])
>>> y2=np.matrix([[1,2],[5,-1]])
>>> a1=x1*y1
>>> a2=x2*y2
>>> a1
array([[ 2, 6],
[15, -5]])
>>> a2
matrix([[17, 1],
[28, 1]])
● Pese a lo anterior, con las arrays se pueden hacer operaciones propias de las
matrices, solo que no de manera tan directa. Por ejemplo, la multiplicación sería de
la siguiente manera
>>> a1=np.matmul(x1,y1)
>>> a1
array([[17, 1],
[28, 1]])
● Hay que tener en cuenta que las señales que se manejan en gnuradio son tipo
arrays, no tipo matrix. Por ejemplo, si un bloque de gnuradio tiene 5 señales de
entrada y cada una un vector de 4 elementos, en cierto instante se podría tener una
señal como la siguiente:
>>> in0
array([[0, 1, 2, 3],
[2, 3, 4, 5],
[3, 4, 5, 6],
[4, 5, 6, 7],
[5, 6, 7, 8]])
En ese caso, los siguientes comandos son útiles:
>>> L=inn0.shape
>>> L
(5, 4)
>>> L[0] # numero de senales
5
>>> L[1] # tamano de los vectores de cada senal
4
>>> in0.mean(0) # la senal promedio
array([ 2.8, 3.8, 4.8, 5.8])
Crear un array
>>> a=np.array(([1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]))
>>> a
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
>>> a_t=np.transpose(a)
>>> a_t
array([[ 1, 5, 9, 13],
[ 2, 6, 10, 14],
[ 3, 7, 11, 15],
[ 4, 8, 12, 16]])
Cov Y ,X Cov Y ,Y
● Hallamos la covarianza
print( np.cov(X) )
[[ 0.115 , 0.0575, -1.2325],
[ 0.0575, 3.757 , -0.8775],
[ -1.2325, -0.8775, 14.525 ]]
libreria matplotlib:
● mi version de pyhton es la 2.7.12. La instalación la hice simplemente así:
○ $ sudo apt-get install python-matplotlib
● las nuevas versiones de python son 3.x.x.x. La instalción es algo así como:
○ $ sudo apt-get install python3-matplotlib
Preparativos:
● previamente se instala drawnow así
Este es un ejemplo:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
from drawnow import *
plt.ion()
def makeFig():
t = np.arange(0,2, 0.01)
s=np.random.rand(200)
plt.plot(t, s)
while True:
drawnow(makeFig)
plt.pause(1)
Otra opción es usar FuncAnimation como en este ejemplo. pero aquí el truco es que
FuncAnimation crea un ciclo infinito, como el while anterior
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib import style
import numpy as np
def makeFig(i):
t = np.arange(0,2, 0.01)
s=np.random.rand(200)
ax1.clear()
ax1.plot(t, s)
fig=plt.figure()
ax1=fig.add_subplot(1,1,1)
ani=animation.FuncAnimation(fig,makeFig,interval=1000)
plt.show()