Numpy Basico.pdf

11

Click here to load reader

Transcript of Numpy Basico.pdf

Page 1: Numpy Basico.pdf

Manejo basico de la libreria NumPy

<img src="http://www.numpy.org/_static/numpy_logo.png">

1 NumPy

En este notebook encontraran algunos ejemplos basicos sobre el uso de la libreria NumPy de python.Para crear arrays en NumPy hay tres formas de hacerlo:

1. A partir de secuencias (Listas o tuplas) de python

2. Usando funciones de NumPy

3. Lectura de datos desde ficheros

4. Copiando desde otro array

1.0.1 Manejo o manipulacion basica de arrays

Los arrays tiene un manejo de sus elementos muy similares a las listas o tuplas,puesto que sucontenido tambien esta indexado. Para acceder a un elemento de array, se hace de la misma formaque en una lista: se indica la posicion del elemento mediante un indice entero entre corchetes [ ]Las formas basicas de seleccion de los elementos de un array de numpy son:

Tipo de Seleccion Sintaxis

Un solo elemento x[i]

Varios elementos x[i : j]

Una rebanada de elementos x[start : end : step]

Elementos en cualquier orden x[[p1, p2, ..., pk]]

# Se importa la libreria numpy

import numpy as np

# Se crea un array utilizando funciones de NumPy

a = np.arange(1,21)

#Se muestra toda la lista

a

array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,

18, 19, 20])

#Se muestra el elemento con indice i:3

a[3]

1

Page 2: Numpy Basico.pdf

4

#Se muestran los elementos desde el indice i=2 hasta el indice i=6

a[2:7]

array([3, 4, 5, 6, 7])

# Se le pasa una lista con las posiciones deseadas (no necesariamente consecutivas).

# Esto es algo nuevo, en ocomparacin con las listas o tuplas en python

a[[2,5,7,10,15,19]]

array([ 3, 6, 8, 11, 16, 20])

Notese que el extraer varios elementos de un array, genera otro array.Los indices del array tambien pueden tomar valores negativos.

# Muestra el elemento i:1 y el ultimo elemento

a[1],a[-1]

(2, 20)

# muestra el elemento i:3, el elemento i:16 y una array con i desde 3 hasta 16

a[3],a[-4],a[3:-4]

(4, 17, array([ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]))

#Muestra los tres ultimos elementos

a[-3:]

array([18, 19, 20])

# Muestra los elementos del array de 2 en 2

a[0:11:2]

array([ 1, 3, 5, 7, 9, 11])

1.0.2 Arrays N-Dimensionales

Se pueden crear de la misma forma que un array simple:

1 Haciendo uso de listas de listas o tuplas de tuplas

2 Usando funciones de NumPy

3 Leyendo desde ficheros

4 Copiando o extrayendo de otro array

5 Haciendo uso de la propiedad shape o del metodo reshape

# Usando la forma 1:

a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])

2

Page 3: Numpy Basico.pdf

print a

print "SHAPE: ", a.shape

[[ 1 2 3 4]

[ 5 6 7 8]

[ 9 10 11 12]]

SHAPE: (3, 4)

#Usando la forma 2:

a1 = np.ones((2,3))

a0 = np.zeros((2,3))

print a0

print a1

[[ 0. 0. 0.]

[ 0. 0. 0.]]

[[ 1. 1. 1.]

[ 1. 1. 1.]]

# Usando shape:

a = np.arange(10)

print " a: ",a

a.shape = [2,5]

a

a: [0 1 2 3 4 5 6 7 8 9]

array([[0, 1, 2, 3, 4],

[5, 6, 7, 8, 9]])

# Usando reshape

a = np.arange(10)

print "a: ", a,"\n"

b = a.reshape((2,5))

print "b: ",b

a: [0 1 2 3 4 5 6 7 8 9]

b: [[0 1 2 3 4]

[5 6 7 8 9]]

La sintaxis para obtener un elemento de la matriz con arrays, difiere de la forma en que seobtiene para una lista:

# Obteniendo el elemento en la fila 1 y columna 2

b[1,2]

3

Page 4: Numpy Basico.pdf

7

#Se crea un array de 5x5

A = np.arange(25)

A.shape = (5,5)

A

array([[ 0, 1, 2, 3, 4],

[ 5, 6, 7, 8, 9],

[10, 11, 12, 13, 14],

[15, 16, 17, 18, 19],

[20, 21, 22, 23, 24]])

Tambien se puede rebanar de forma indexada una matriz

A[1:3,2:4]

array([[ 7, 8],

[12, 13]])

B = A[::2,::2]

B

array([[ 0, 2, 4],

[10, 12, 14],

[20, 22, 24]])

Se pueden utilizar etiquetas para los indices del array. Esta es una forma elegante y util enalgunos casos.

i,j=0,2

A[i,j]

2

Se pueden utilizar listas como indices de la misma forma:

filas = [0,2,4]

columnas = [1,2,3]

A[filas]

array([[ 0, 1, 2, 3, 4],

[10, 11, 12, 13, 14],

[20, 21, 22, 23, 24]])

A[filas,columnas]

array([ 1, 12, 23])

4

Page 5: Numpy Basico.pdf

Los indices pueden ser datos booleanos, es decir TRUE o FALSE

mask_1 = np.array([True,True,True,True,True])

mask_2 = np.array([True,False,True,False,True])

A[mask_1]

array([[ 0, 1, 2, 3, 4],

[ 5, 6, 7, 8, 9],

[10, 11, 12, 13, 14],

[15, 16, 17, 18, 19],

[20, 21, 22, 23, 24]])

A[np.array([False,True])]

array([[5, 6, 7, 8, 9]])

A[mask_2]

array([[ 0, 1, 2, 3, 4],

[10, 11, 12, 13, 14],

[20, 21, 22, 23, 24]])

x = np.arange(5)

print x

mask=np.array([True,True,False,True,False],dtype=bool)

x[mask]

[0 1 2 3 4]

array([0, 1, 3])

Esto es util cuando se quieren evaluar condiciones en el array. Por ejemplo: filtrar entradas

a = np.arange(0,20)

a

array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,

17, 18, 19])

# Se verifican que numeros son mayores a 7. El resultado es un array con datos booleanos

mask = a>7

mask

array([False, False, False, False, False, False, False, False, True,

True, True, True, True, True, True, True, True, True,

True, True], dtype=bool)

5

Page 6: Numpy Basico.pdf

#Se evalua el array con la mascara obtenida,

a[mask] # se muestran solo los elementos que cumplieron la condicion

array([ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])

Si se quieren obtener los numero que sean mayor que una cota inferior (x > xmin) y menorque una cota superior (x < xmax), se multiplica el resultado de las dos condiciones evaluadas porseparado.

mask1 = a>7

mask1

array([False, False, False, False, False, False, False, False, True,

True, True, True, True, True, True, True, True, True,

True, True], dtype=bool)

mask2 = a<14

mask2

array([ True, True, True, True, True, True, True, True, True,

True, True, True, True, True, False, False, False, False,

False, False], dtype=bool)

mask = (a>7)*(a<14)

mask

array([False, False, False, False, False, False, False, False, True,

True, True, True, True, True, False, False, False, False,

False, False], dtype=bool)

a[mask]

array([ 8, 9, 10, 11, 12, 13])

2 ALGEBRA LINEAL CON NUMPY

2.0.3 Operaciones entre escalares y arrays

v1 = np.arange(5)

v1

array([0, 1, 2, 3, 4])

6

Page 7: Numpy Basico.pdf

v1*2

array([0, 2, 4, 6, 8])

v1 + 2

array([2, 3, 4, 5, 6])

A*2

array([[ 0, 2, 4, 6, 8],

[10, 12, 14, 16, 18],

[20, 22, 24, 26, 28],

[30, 32, 34, 36, 38],

[40, 42, 44, 46, 48]])

A+2

array([[ 2, 3, 4, 5, 6],

[ 7, 8, 9, 10, 11],

[12, 13, 14, 15, 16],

[17, 18, 19, 20, 21],

[22, 23, 24, 25, 26]])

v1*v1

array([ 0, 1, 4, 9, 16])

A*A # Se multiplica elemento a elemento (no es una multiplicacion de matrices)

array([[ 0, 1, 4, 9, 16],

[ 25, 36, 49, 64, 81],

[100, 121, 144, 169, 196],

[225, 256, 289, 324, 361],

[400, 441, 484, 529, 576]])

A*v1

array([[ 0, 1, 4, 9, 16],

[ 0, 6, 14, 24, 36],

[ 0, 11, 24, 39, 56],

[ 0, 16, 34, 54, 76],

[ 0, 21, 44, 69, 96]])

2.0.4 Algebra de matrices

Para multiplicar matrices, se puede hacer de dos formas: 1. Se utiliza la funcion dot de numpyque puede ser aplicada a la multiplicacion matriz-matriz, matriz-vector o vector-vector(producto

7

Page 8: Numpy Basico.pdf

interno) 2. Haciendo un casting a matrix para que los operadores *, -, + queden sobrecargados

np.dot(A,A)

array([[ 150, 160, 170, 180, 190],

[ 400, 435, 470, 505, 540],

[ 650, 710, 770, 830, 890],

[ 900, 985, 1070, 1155, 1240],

[1150, 1260, 1370, 1480, 1590]])

np.dot(A,v1)

array([ 30, 80, 130, 180, 230])

np.dot(v1,v1)

30

# Haciendo el casting

M = np.matrix(A)

M

matrix([[ 0, 1, 2, 3, 4],

[ 5, 6, 7, 8, 9],

[10, 11, 12, 13, 14],

[15, 16, 17, 18, 19],

[20, 21, 22, 23, 24]])

M*M

matrix([[ 150, 160, 170, 180, 190],

[ 400, 435, 470, 505, 540],

[ 650, 710, 770, 830, 890],

[ 900, 985, 1070, 1155, 1240],

[1150, 1260, 1370, 1480, 1590]])

M + M

matrix([[ 0, 2, 4, 6, 8],

[10, 12, 14, 16, 18],

[20, 22, 24, 26, 28],

[30, 32, 34, 36, 38],

[40, 42, 44, 46, 48]])

M.T

matrix([[ 0, 5, 10, 15, 20],

[ 1, 6, 11, 16, 21],

[ 2, 7, 12, 17, 22],

8

Page 9: Numpy Basico.pdf

[ 3, 8, 13, 18, 23],

[ 4, 9, 14, 19, 24]])

#A = np.array([[1.,2.,3.,5.],[0,-1.,2.,3.],[4.,0,0,2.],[1.,3.,0,1.]])

A = np.array([[3.,2.],[3.,4.]])

M = np.matrix(A)

M

matrix([[ 3., 2.],

[ 3., 4.]])

M.I

matrix([[ 0.66666667, -0.33333333],

[-0.5 , 0.5 ]])

print (M*M.I)

[[ 1. 0.]

[ 0. 1.]]

np.linalg.det(M)

6.0

2.1 Procesamiento de datos

x = np.random.rand(20) # Crea un array con 20 numeros aleatorios entre [0,1)

x

array([ 0.22805884, 0.13147996, 0.59162834, 0.01609892, 0.1596889 ,

0.58051713, 0.85565047, 0.33222481, 0.49542213, 0.22280343,

0.84858787, 0.21242671, 0.78883623, 0.80013435, 0.88774711,

0.51741227, 0.11330968, 0.95400589, 0.05716937, 0.19833854])

# suma de todos los elementos

np.sum(x)

8.9915409391687717

# Promedio

np.sum(x)/len(x)

0.44957704695843859

9

Page 10: Numpy Basico.pdf

# suma cumulativa del array

np.cumsum(x)

array([ 0.22805884, 0.3595388 , 0.95116714, 0.96726607, 1.12695496,

1.70747209, 2.56312256, 2.89534737, 3.3907695 , 3.61357292,

4.46216079, 4.6745875 , 5.46342373, 6.26355808, 7.1513052 ,

7.66871746, 7.78202714, 8.73603303, 8.7932024 , 8.99154094])

# media o promedio

np.mean(x)

0.44957704695843859

# valor maximo y minimo del array

np.min(x),np.max(x)

(0.016098923490379446, 0.95400589155259152)

# el producto de todos los elementos del array

np.prod(x)

5.3215484228038969e-11

2.2 Lectura de archivo de datos

# Se va a leer el archivo noble.dat

# la variable aguardar los archivos de la tabla

tabla = np.loadtxt(’nobles.dat’)

#Se muestra el contenido de tabla

# que es una matriz

tabla

array([[ 2. , 4.0026],

[ 10. , 20.183 ],

[ 18. , 39.948 ],

[ 36. , 83.8 ],

[ 54. , 131.3 ],

[ 86. , 222. ]])

tabla[:,0] # muestra la columna 0 con todas las filas

array([ 2., 10., 18., 36., 54., 86.])

tabla[:,1] # muestra la columna 1 con todas las filas

array([ 4.0026, 20.183 , 39.948 , 83.8 , 131.3 , 222. ])

10

Page 11: Numpy Basico.pdf

# Cada columna puede ser guardada en una variable distinta

Z = tabla[:,0] #numero atomico

P = tabla[:,1] #peso

# Se pueden guardar los datos en variables distinta desde la lectura del archivo

Zatomico,Patomico = np.loadtxt(’nobles.dat’,unpack=True)

Zatomico

array([ 2., 10., 18., 36., 54., 86.])

Patomico

array([ 4.0026, 20.183 , 39.948 , 83.8 , 131.3 , 222. ])

# se puede guardar un array de numpy en un archivo de datos

Zatomico = Zatomico*2.

Patomico = Patomico/2.0

DAT = np.array([Zatomico,Patomico])

np.savetxt(’nobles_nuevo.dat’,DAT.T,fmt=’%.3f’)

DAT.T da como resultado la transpuesta de la matriz. Esto se hace con el fin de que los datosqueden guardados en 2 columnas. DAT es una matriz de 2 filas por 6 columnas, mientras queDAT.T en una matriz de 6 filas por 2 columnas. Observen:

DAT

array([[ 4. , 20. , 36. , 72. , 108. , 172. ],

[ 2.0013, 10.0915, 19.974 , 41.9 , 65.65 , 111. ]])

DAT.T

array([[ 4. , 2.0013],

[ 20. , 10.0915],

[ 36. , 19.974 ],

[ 72. , 41.9 ],

[ 108. , 65.65 ],

[ 172. , 111. ]])

11