You are on page 1of 9

Tutorial bsico de Python a

Daniel Hurtado, Ph.D.


Profesor Asistente Departamento de Ingenier Estructural y Geotcnica UC a e

Introduccin o

Python es un lenguaje de programacin muy utilizado en computacin cient o o ca. Python tiene muchas ventajas por sobre otros lenguajes utilizados en computacin cient o ca, entre ellas ser un lenguaje interpretado y orientado a objetos, tener una sintaxis simple, ser multiplataforma (Linux, MacOS, Windows), y la mejor de todas, ser software libre, es decir, de cdigo abierto y gratis1 . o Una vez inicializado, la manera de comunicarse con python es a travs de la l e nea de comando, la cual se ve en pantalla de la siguiente manera >>> Entonces, al ingresar cdigo en la l o nea de comando, Python interpretar el cdigo ingresado, a o arrojando un resultado, el cual puede o no ser mostrado en la pantalla. En su funcin ms bsica, o a a Python puede ser usado como una simple calculadora >>> 3.*(10.+ 2.5) 37.5 >>> sqrt(2.**2.) 2.0 >>> cos(2.*pi) 1.0 Notar que los nmeros reales en Python siempre incluyen el punto . aunque no tenga decimales. u Se pueden denir variables en Python y hacer operaciones con ellas >>> a=cos(3./4.*pi); b=sin(3./4.*pi) >>> a**2 + b**2 1.0

Arreglos de datos usando NumPy

Para hacer calculos numricos ms complejos (funciones trigonometricas, vectores, matrices, algee a bra lineal), importamos la librer de python NumPy mediante el siguiente comando a >>> import numpy as np
La licensia de Python est especicada en Python Software Foundation License, y es compatible con la licencia a pblica general GNU u
1

Lo anterior implica que todos las funciones de la librer NumPy estn disponibles mediante el a a objeto np. Por ejemplo >>> np.arctan(1.0)/np.pi 0.25 donde np.pi es la constante , la cual est automaticamente denida en la libreria NumPy . a Un arreglo (np.array) es la unidad bsica de clculos numricos ms complejos. Se puede denir a a e a un arreglo de varias maneras. La ms directa es: a >>> a = np.array([[1.,2.,3.],[4.,5.,6.]]) >>> a array([[ 1., 2., 3.], [ 4., 5., 6.]]) Todas las variables creadas en Python son un objeto, y como tal, contienen datos y mtodos. e Para el caso anterior, los datos del objeto a son los valores del arreglo. Un mtodo muy utilizado e en arreglos es shape, que entrega las dimensiones de un arreglo >>> a.shape (2, 3) En particular, si se requiere solo el n mero de las hacemos u >>> a.shape[0] 2 y para el caso de el n mero de columnas hacemos u >>> a.shape[1] 3 Una manera de generar automticamente un arreglo es mediante el comando arange a >>> b = np.arange(0.0, 2.1, 0.4) >>> b array([ 0. , 0.4, 0.8, 1.2, 1.6, 2. ]) donde los primeros dos argumentos indican en valor inicial y la cota superior del arreglo, y el tercer argumento indica la diferencia entre los elementos consecutivos del arreglo. Si el tercer argumento no se especica, se considera automticamente un valor igual a 1.0. Otra manera de generar un a arreglo equi-espaciado es mediante el comando np.linspace >>> b2 = np.linspace(0.0, 2.1,6) >>> b2 array([ 0. , 0.42, 0.84, 1.26,

1.68,

2.1 ])

donde los primeros dos argumentos denen los l mites inferior y superior del intervalo que dene el dominio, y el tercer argumento indica el nmero de puntos a generar. Notar que ambos u mtodos arrojan resultados distintos, ya que np.arange fuerza los incrementos entre nmeros cone u sectivos (aunque el ultimo elemento del arreglo no coincida con el l mite superior), mientras que np.linspace privilegia tener los ambos l mites en el arreglo, con puntos interiores equidistantes. Podemos realizar operaciones vectoriales (suma, multiplicacin escalar) sobre un arreglo o 2

>>> c = np.arange(0.0,6.0) >>> b-0.7*c array([ 0. , -0.3, -0.6, -0.9, -1.2, -1.5]) Muchas de las funciones tradicionales operan componente-a-componente sobre un arreglo >>> np.sin(3./4.*np.pi*c) array([ 0.00000000e+00, 7.07106781e-01, -1.00000000e+00, 7.07106781e-01, 3.67394040e-16, -7.07106781e-01]) Se puede extraer elementos del arreglo considerando las siguientes convenciones de indexacin: el o primer elemento es el 0, e indices negativos entregan los elementos del nal de un arreglo >>> a = np.array([[2.1, 3.5, 7.0],[10.4, 12.9, 5.1]]) >>> a array([[ 2.1, 3.5, 7. ], [ 10.4, 12.9, 5.1]]) >>> a[0,1] 3.5 >>> a[1,-2] 12.9 >>> a[:,1] array([ 3.5, 12.9]) >>> a[0,1:3] array([ 3.5, 7.])

Grcos cient a cos y la libreria Matplotlib

La librer Matplotlib permite generar grcos cient a a cos 2D y 3D de alta calidad usando python, los cuales pueden ser exportados a varios formatos grcos (.PDF, .PNG, etc). Para importar la a libreria Matplotlib, ejecutamos el comando >>> import matplotlib.pylab as plt donde el objeto plt contiene todos los mtodos y datos de la libreria Matplotlib. Supongamos e que queremos gracar la funcin o f1 (x) = sin(x) y su aproximacin de Taylor de tercer orden o f2 (x) = x x3 6

en el dominio x [, ]. Primero debemos generar un arreglo con puntos en el dominio mediante >>> x = np.linspace(-np.pi, np.pi, 50) Luego, generamos un arreglo del mismo tamao que contenga los puntos en el recorrido asociados n a x, para las dos funciones, de la siguiente forma >>> fx1 = np.sin(x) >>> fx2 = x - x**3./6. 3

2.0 1.5 1.0 0.5 Recorrido 0.0 0.5 1.0 1.5 2.0 3 2

Grafica de funciones Funcion Seno Aproximacion Taylor

0 Dominio

Figure 1: Ejemplo de grco usando Maplotlib a Finalmente, gracamos usando el comando plt.plot >>> plt.plot(x,fx1) >>> plt.plot(x,fx2) Se pueden jar los l mites en el eje x y el eje y del grco haciendo a >>> plt.xlim(-np.pi, np.pi) >>> plt.ylim(-2.0,2.0) Adems, podemos agregar t a tulo, y nombre de los ejes mediante >>> plt.title(Grafica de funciones) >>> plt.xlabel(Dominio) >>> plt.ylabel(Recorrido) Es posible obtener una grilla mediante >>> plt.grid(True) Tambin pueden agregarse leyendas al grco e a >>> plt.legend((Funcion Seno,Aproximacion Taylor),0) Por ultimo, el grco puede ser guardado en un archivo mediante a >>> plt.savefig(grafico.pdf) El grco obtenido con estos comandos se puede apreciar en la Figura 1. Notar que en algunos a sistemas la ventana con la gura es automticamente desplegada. En caso de no ser as ejecutamos a , >>> plt.show() 4

Vectores, matrices y algebra lineal usando NumPy

Una matriz (np.matrix) se dene de la siguiente manera >>> a=np.matrix([[1.,3.,-5.],[3.,4.,2.],[-5.,2.,0.]]) >>> a matrix([[ 1., 3., -5.], [ 3., 4., 2.], [-5., 2., 0.]]) mientras que un vector queda es representado por una matriz con una columna (vector columna) o una la (vector la) >>> b = np.matrix([[1.0],[5.0],[3.0]]) >>> b matrix([[ 1.], [ 5.], [ 3.]]) La matrices son objetos que tienen algunos mtodos asociados. Por ejemplo, podemos obtener una e matriz traspuesta y una inversa haciendo >>> a.T matrix([[ 1., 3., -5.], [ 3., 4., 2.], [-5., 2., 0.]]) >>> a.I matrix([[ 0.02439024, 0.06097561, -0.15853659], [ 0.06097561, 0.15243902, 0.10365854], [-0.15853659, 0.10365854, 0.0304878 ]]) Usando el operador * podemos hacer multiplicacin matricial o >>> a.I * matrix([[ [ [ a 1.00000000e+00, 0.00000000e+00, 0.00000000e+00], 0.00000000e+00, 1.00000000e+00, 0.00000000e+00], -5.55111512e-17, -5.55111512e-17, 1.00000000e+00]])

El paquete linalg de NumPy contiene las operaciones t picas de algebra lineal. Podemos calcular el determinante de una matriz cuadrada haciendo >>> np.linalg.det(a) -163.99999999999991 Tambin es posible resolver un sistema matricial de la siguiente forma e >>> np.linalg.solve(a,b) matrix([[-0.14634146], [ 1.13414634], [ 0.45121951]]) Los valores y vectores propios de una matriz se calculan como 5

>>> lam, phi = np.linalg.eig(a) >>> lam array([-5.78304165, 6.23396835, 4.5490733 ]) >>> phi matrix([[ 0.65072855, -0.7001856 , -0.29375583], [-0.33849942, -0.61380708, 0.71320335], [ 0.67968412, 0.3646656 , 0.6364342 ]]) nalemente podemos convertir un arreglo en una matriz haciendo >>> np.mat(arange(0.,4.)) matrix([[ 0., 1., 2., 3.]])

Ciclos (for, while) y condicionales (if, elif, else)

En Python , un bucle o ciclo for se dene como >>> for i in arange(5) : print i**2 en donde i tomar todos los valores del arreglo generado por arange(5). El resultado del cdigo a o anterior es 0 1 4 9 16 Es muy importante destacar que en el cdigo anterior se usa una indentacin (tab) despues de for o o i in arange(5) : para la declaracin del cdigo a ejecutar en cada paso del ciclo. En importante o o destacar que Python utiliza indentacin (tab) para denir los alcances/anidamientos del o cdigo, algo que en otros lenguajes se hace mediante caracteres (por ejemplo, parntesis { } en o e C++). Alternativamente, un ciclo for puede iterar sobre los elementos de un set (en vez de iterar sobre nmeros enteros). Por ejemplo u >>> for a in arange(0.0, 10.0, 3.3) : print 2*a 0.0 6.6 13.2 19.8 Se dene un condicional en Python mediante los comandos if, elif, else. Por ejemplo, >>> x = 5. >>> if x > 2. : print x es mayor que 2 else : print x es menor o igual que 2 6

El resultado de los anterior es x es mayor que 2 El uso del condicional elif ser mostrado en la siguiente seccin. a o

Denicin de funciones en Python o


0 x < 0.5 f (x) = 1 0.5 x 0.5 0 x > 0.5

Consideremos la funcin de bloque o

Se puede denir esta funcin block(x) en Python de la siguiente manera o def block(x) : if x < -0.5 : return 0.0 elif x <= 0.5 : return 1.0 else : return 0.0 Entonces, podemos ocupar la funcin denida desde la l o nea de comando >>> block(0.33) 1.0 >>> block(2.5) 0.0 Notar dos cosas muy importantes en la denicin de una funcin: o o 1. El comando return es el encargado de devolver un resultado. Siempre debe estar presente en la denicin de una funcin, a menos que el resultado se entregue directamente en el input. o o 2. Es muy importante poner atencin a la indentacin (tabs) para lograr el funcionamiento o o deseado. En el ejemplo hay dos niveles de anidamiento: el primero corresponde a la denicin o de una funcin (primera indentacin) y el segundo al condicional if, elif, else (segunda o o indentacin). o

Scripts y cmo ejecutarlos en Python o

Un script es un archivo de texto con extensin .py con una serie de comandos y denicin de o o funciones, el cual puede ser ejecutado en la l nea de comando (>>>) de Python . Por ejemplo, el archivo tutorial.py contiene lo siguiente:

# importar librerias import numpy as np import matplotlib.pylab as plt # definicion de funciones def block(x) : if x < -0.5 : return 0.0 elif x <= 0.5 : return 1.0 else : return 0.0 # codigo principal x = np.linspace(-1.,1.,11) fx = np.zeros(x.shape) for i in np.arange(x.shape[0]) : fx[i] = block(x[i]) print x = , x print f(x) = , fx Entonces, ejecutamos este script desde la l nea de comando usando la funcion execfile de la siguiente manera >>> execfile(tutorial.py) x = [-1. -0.8 -0.6 -0.4 -0.2 f(x) = [ 0. 0. 0. 1. 1. 0. 1. 0.2 1. 0.4 1. 0.6 0. 0.8 0. 1. ] 0. ]

donde las dos ultimas l neas son el output generado por el script tutorial.py

Referencias y Links

La comunidad de Python tiene mucha documentacin y tutoriales en linea. A continuacin se o o incluye una breve seleccin de algunos sitios web que pueden ser muy utiles: o Python for Science, por David J. Raymond: Excelente tutorial para computacin cient o ca. Contiene muchos ms ejemplos de como usar las librerias NumPy y Matplotlib. a http://physics.nmt.edu/~raymond/software/python_notes/index.html Pgina ocial de Matplotlib: Contiene toda la documentacin, ejemplos y varios tutoriales. a o Particularmente util es la galer de grcos, la cual incluye los cdigos de cada caso. a a o http://matplotlib.sourceforge.net NumPy for Matlab Users: Recurso perfecto para usuarios de Matlab que quieren convertirse a Python http://www.scipy.org/NumPy_for_Matlab_Users

Existe tambin completa documentacin de Python y sus librerias. No son el mejor punto de e o partida ya que son muy extensas, pero resultan muy utiles como referencia para programadores intermedios y avanzados. Algunas de ellas son The Python Standard Library: Documentacin de la librer estndar de Python o a a http://docs.python.org/library NumPy Reference: Documentacin de la librer NumPy o a http://docs.scipy.org/doc/numpy/reference SciPy Documentation: Incluye documentacin de la librer SciPy, la cual contiene muchas o a aplicaciones para computacin cient o ca (integracin numrica, interpolacin, optimizacin, o e o o procesamiento de seales, etc) n http://docs.scipy.org/doc/scipy/reference

You might also like