You are on page 1of 22

INTRODUCCION A NUMPY I-A

Nivel Intermedio - Avanzado

ESCUELA SUPERIO POLITECNICA DEL LITORAL


TALLER INTERMEDIO-AVANZADO

NUMPY
INDEXAMIENTO CON BOOLEANO
Los arreglos booleanos usados como ndices son tratados de una manera distinta a los
arreglos indexados normales. Con una variable almacenando un arreglo de booleanos se
puede evaluar un arreglo de integers (Enteros) de la manera vista para retornar todos
aquellos elementos que cumplan con la condicin. Ntese la creacin de la variable b que
almacena el arreglo booleano.
TALLER INTERMEDIO-AVANZADO

NUMPY

Para retornar algo distinto a un arreglo de 1 dimensin se puede realizar lo siguiente.

Ntese que se modific el tamao de la matriz B de tal forma que concuerde con el
tamao de la matriz X. En la Fila 2 de la Matriz B se tienen valores FALSE y TRUE, e igual
es seleccionada como una fila TRUE. Esto es pues la mitad de los elementos cumplen con
la condicin. En caso de que la mitad de los elementos menos 1 sean TRUE la fila
continuara siendo FALSE.
TALLER INTERMEDIO-AVANZADO

NUMPY

Tambin se tiene que la matriz booleana puede no tener las mismas dimensiones que la
matriz de enteros. Si y solo si las dimensiones de las matrices coordinen en las primeras
dimensiones se dar los siguiente.

Ntese que la matriz B tiene una dimensin de (2,3) y la matriz X una dimensin de
(2, 3,5) y ambas dimensiones coordinan en sus primeras dos.
TALLER INTERMEDIO-AVANZADO

NUMPY

INDEXAMIENTO CON NDICES


Los arreglos tambin se pueden indexar con otros arreglos. Esto nos sirve para obtener
varios elementos a la vez. Este indexamiento retorna un elemento de tipo array.

Para arreglos multidimensionales tambin se tiene lo siguiente.


TALLER INTERMEDIO-AVANZADO

NUMPY

Ntese que A y B son matrices. La matriz A es [1,1] e indexada a la matriz X entrega la


posicin (1,1). La matriz B es [0,1] e indexada a la matriz X entrega la posicin (0,1).

OPERACIONES CON MATRICES


Con numpy se pueden realizar operaciones con escales y otras matrices.
El tipo de operacin realizada con los escalares es UNO a TODOS. En el siguiente ejemplo
se tiene un escalar multiplicando una matriz numpy 2x3.

El tipo de operacin realizada con otras matrices es ELEMENTO a ELEMENTO. Una


condicin es el uso de matrices con mismas dimensiones.

En el ejemplo se puede notar la SUMA de cada uno de los elementos en sus respectivas
posiciones.
TALLER INTERMEDIO-AVANZADO

NUMPY
BROADCASTING
El trmino Broadcasting describe cmo numpy trata arreglos con diferentes formas
durante operaciones aritmticas.
Para realizar broadcast se tiene dos nicas reglas.
1) Deben tener dimensiones iguales, o
2) Una de las dimensiones es 1
Se presentan algunos ejemplos de broadcast en las matrices de numpy.

EJEMPLO 1

EJEMPLO 2
TALLER INTERMEDIO-AVANZADO

NUMPY

EJEMPLO 3
En este ejemplo se tendr es mismo resultado que el ejemplo 2.
TALLER INTERMEDIO-AVANZADO

NUMPY
FUNCIONES AGREGADAS
Ordering:

argmax Retorna el ndice del elemento (Argumento) mximo.

argmin Retorna el ndice del elemento mnimo

min Retorna el mnimo nmero dentro de un arreglo.


TALLER INTERMEDIO-AVANZADO

NUMPY

max Retorna el mximo nmero dentro de un arreglo

sort
Retorna un arreglo ordenado
TALLER INTERMEDIO-AVANZADO

NUMPY

Basic Statistics: para todas estas un eje dado o todo el arreglo (slicing)

mean

Retorna un nico entero (int) con la MEDIA del arreglo de una dimensin o
n dimensiones.
TALLER INTERMEDIO-AVANZADO

NUMPY

Retorna un nico entero (int) con la DESVIACIN ESTNDAR del arreglo de


std una dimensin o n dimensiones.
TALLER INTERMEDIO-AVANZADO

NUMPY
var Retorna un nico entero (int) con la VARIANZA del arreglo de una
dimensin o n dimensiones.
TALLER INTERMEDIO-AVANZADO

NUMPY

Array Math:

Sqrt Esta funcin de la librera numpy retorna un arreglo de las mismas


dimensiones que el arreglo enviado como argumento pero con la diferencia
que sus elementos son la raz cuadrada de los elementos del arreglo enviado.

sum() Esta funcin realiza una suma de todos los elementos en forma
dependiente del argumento enviado. Con argumento None (o vacio) se
hace la suma total de todos los elementos. Con argumento 1 se hace la
suma total de elementos segn las filas
TALLER INTERMEDIO-AVANZADO

NUMPY
prod() Esta funcin realiza una multiplicacin de todos los elementos en forma
dependiente del argumento enviado. Con argumento None (o vacio) se
entrega la multiplicacin total de todos los elementos. Con argumento 1
se entrega la multiplicacin total de elementos segn las filas
TALLER INTERMEDIO-AVANZADO

NUMPY

EJERCICIO 1:
Se dispone de un arreglo de NumPy que representa el tiempo de
navegacin en Internet de una empresa expresada en un arreglo de nxm.

Sitios
Sitios de Trabajo Sitios de No Trabajo
Empleados

Quipux Espol Mail Twitter Facebook Tumblr


Leonardo 130 91 83 10 21 0
Jorge 40 59 100 10 0 15
Galo 30 49 18 38 47 0

Se dispone de las listas empleados, la lista de sitios de trabajo, y la


lista de sitios de No Trabajo. La empresa requiere elaborar un reporte
de las visitas a internet que incluya los siguientes datos:

a. Tiempo total de uso de Internet


b. Tiempo total de uso de Internet por empleado
c. Tiempo total de visita por sitio
d. Tiempo total de visita por sitio de trabajo
e. Tiempo total de visita por sitios que no son de trabajo
f. El nombre del empleado que ms tiempo ha pasado en sitios
que no son de trabajo
g. El sitio de trabajo que ms tiempo ha sido usado
h. Si el proveedor de Internet cobra un valor de 5 centavos por
minuto de visita a los sitios de trabajo y el doble para los otros
sitios. Calcule el total a pagar en dlares.
i. Cuntos empleados han visitado cada sitio?

Desarrolle un programa en Python que calcule los resultados a las


preguntas anteriores y muestre por pantalla las respuestas. Suponga que
usted tiene una funcin llamada generarReporte( ), la cual crea el
reporte como un arreglo Numpy (no se preocupe por cmo funciona
esto, simplemente selo de la siguiente manera para crear el arreglo
numpy: arreglo= generarReporte( ))
TALLER INTERMEDIO-AVANZADO

NUMPY

Solucin:
Tips:
a. Recuerde que el arreglo numpy son solo los
NUMEROS. Los nombres de los sitios y el nombre de
los empleados son solo para motivos de
representacin. Un arreglo no puede contener al mismo
tiempo diferentes tipos de datos.
b. Recuerde utilizar funciones de numpy. Estas nos
facilitan las soluciones en gran manera, a diferencia de
tratar el arreglo como si fueran listas. Esto seria todo un
dolor de cabeza.

import numpy as np
empleados = []
sitios_trabajo = []
sitios_no_trabajo = []
arreglo = generarReporte()
# a. Se suman TODOS los elementos del arreglo.
tiempo_total = arreglo.sum()
# b. Obtengo la suma por cada una de las filas
(empleado) de la matriz.
tiempo_por_empleado = arreglo.sum(axis=1)
# c. Obtengo la suma por cada una de las columnas
(sitios) de la matriz.
tiempo_por_sitio = arreglo.sum(axis=0)
# d. Ya tengo el tiempo total de visita por cada uno
los sitios en b. Y sabemos que los sitios de trabajo
son las primeras N columnas del arreglo. Donde N es
el nmero de sitios de trabajo que existen, lo cual
lo puedo calcular obteniendo la longitud de la lista
de sitios de trabajo. Por lo tanto, a partir del
arreglo obtenido en b, utilizando slicing, obtengo
los tiempos por sitio de trabajo.
TALLER INTERMEDIO-AVANZADO

NUMPY

tiempo_por_sitio_trabajo =
tiempo_por_sitio[0:len(sitios_trabajo)]

# e. Sabemos que los sitios de no trabajo, son las


ultimas N columnas del arreglo. Utilizando una
lgica similar a la usada en c. Voy a hacer un
slicing desde donde terminan los sitios de trabajo,
hasta el final del arreglo. Lo cual, es la suma de
tiempo correspondiente a los sitios de no trabajo.

tiempo_por_sitios_no_trabajo =
tiempo_por_sitio[len(sitios_trabajo):]

# f. Primero tengo que particionar el arreglo


inicial, solo con los sitios de no trabajo. Luego,
obtengo la suma de tiempo que cada empleado ha
pasado en estos sitios, haciendo una suma por filas
(axis = 1). Finalmente obtengo la posicion del
elemento maximo, esta posicion me representa la fila
que ha pasado mas tiempo en sitios de no trabajo, y
las filas me representan empleados, cuyos nombres
tengo en mi lista empleados.

arreglo_no_trabajo = arreglo[:,
len(sitios_trabajo:]
tiempo_por_empleado_sitios_nt =
arreglo_no_trabajo.sum(axis=1)
posicion_empleado_mas_vago =
tiempo_por_empleado_sitios_nt.argmax()
empleado_mas_vago =
empleados[posicion_empleado_mas_vago]
TALLER INTERMEDIO-AVANZADO

NUMPY
# g.

posicion_sitio_mas_visitado =
tiempo_por_sitio_trabajo.argmax()
sitio_vas_visitado =
sitios_trabajo[posicion_sitio_mas_visitado]
# h. Utilizando las respuestas de d. y e., sumo
todos los elementos de estos arreglos y obtengo el
tiempo total de visita en sitios de trabajo y sitios
de no trabajo. Multiplico este valor total por el
multiplicador que nos dice el ejercicio y finalmente
los sumo.
valor_trabajo = tiempo_por_sitio_trabajo.sum() *
0.05
valor_no_trabajo =
tiempo_por_sitios_no_trabajo.sum() * 0.10
valor_a_pagar = valor_trabajo + valor_no_trabajo
# i. Sabemos que un empleado ha visitado un sitio,
cuando este ha pasado ms de cero minutos en el
mismo. Por lo tanto, lo que tenemos que hacer es
iterar el arreglo por columnas (sitios). En cada
iteracin del lazo for, obtengo la columna
correspondiente a cada sitio utilizando slicing.
Luego utilizando indexacin booleana, en esa columna
obtengo todos los elementos que sean mayores que
cero, es decir, todos los empleados que hayan pasado
mas de Cero minutos en esa pagina. Obteniendo la
dimensin de ese arreglo (len), tengo el numero de
empleados que han visitado ese sitio.
empleados_por_sitio = []
sitios = sitios_trabajo + sitios_no_trabajo
for i in range(0, len(sitios)):
t_de_sitio = arreglo[:, i]
numero_empleados =
len(t_de_sitio[t_de_sitio>0])
empleados_por_sitio.append(numero_empleados)
TALLER INTERMEDIO-AVANZADO

NUMPY

EJERCICIO 2:
El CNE (Consejo Nacional Electoral) tiene datos relacionados a la cantidad de hombres y
mujeres que sufragarn en cada recinto electoral de una determinada ciudad en las prximas
elecciones presidenciales. Al CNE le interesa conocer cierta informacin a partir de una matriz
de mx2 que tiene una estructura como la mostrada a en el ejemplo a continuacin:

Hombres Mujeres
Recinto1 7569 8554
Recinto2 4623 2656
Recinto3 5568 5789

RecintoM 6865 5433

Asuma que la variable matriz ya se encuentra creada y almacena datos tal como se muestra en
el ejemplo.
Elabore un programa que muestre la siguiente informacin:

a) Nmero total de habitantes que sufragan en la ciudad.


b) Nmero total de hombres y mujeres que sufragan en la ciudad.
c) El nmero del recinto en el que sufraga la mayor cantidad de hombres.
d) El promedio de mujeres que sufragan por recinto.

Adems, el programa deber mostrar una matriz llamada totales de 1xm que muestre el total
de habitantes que sufragan por recinto, como se muestra en el ejemplo a continuacin:

Recinto1 Recinto2 Recinto3 RecintoM


16123 7279 11357 12298

Por ltimo, del arreglo totales muestre la cantidad de recintos que tienen ms de 10.000
votantes.
TALLER INTERMEDIO-AVANZADO

NUMPY

Solucin:

Debido a que asumimos que el arreglo matriz ya existe (no nos interesa como fue creado), no
hay necesidad de inicializar la variable. Lo nico que nos debe interesar es reconocer la
estructura que tiene.

OBS: Las soluciones mostradas a continuacin no son las nicas posibles.

Literal a

Inicialmente debemos mostrar el nmero total de habitantes que sufragan en la ciudad. Para
esto, podemos aprovechar las facilidades que ofrece Numpy para realizar operaciones sobre
todo el arreglo.
totalVotantes = np.sum(matriz)
print("El nmero total de vontantes en la ciudad es de: ", totalVotantes)

La primera lnea del cdigo mostrado permite almacenar en la variable totalVotantes la suma
de todos los valores presentes en la matriz.

Literal b

Si tuviramos dos matrices distintas, con la informacin nicamente de hombres y de mujeres,


podramos utilizar la misma funcin usada en el literal anterior para sumarlas. Numpy permite
obtener submatrices a partir de una matriz dada.

arregloHombres = matriz[ : , 0]
arregloMujeres = matriz[ : , 1]

totalHombres = np.sum(arregloHombres)
totalMujeres = np.sum(arregloMujeres)

print("El total de hombres que sufragan en la ciudad es: ",


totalHombres)
print("El total de mujeres que sufragan en la ciudad es: ",
totalMujeres)

Las primeras dos lneas de cdigo permiten obtener dichas submatrices a travs del concepto
de Slicing. Por ejemplo en la primera lnea de cdigo, bsicamente decimos que del arreglo
matriz deseamos obtener TODAS las filas pero nicamente de la columna 0; lo mismo para la
segunda lnea. Una vez obtendos tales arreglos, es posible realizar la misma operacin usada
en el literal anterior.
TALLER INTERMEDIO-AVANZADO

NUMPY

Literal c

Obtener informacin acerca de los hombres resulta ms sencillo ahora que contamos con el
arreglo arregloHombres obtenido en el literal previo. La funcin argmax permite obtener el
ndice del elemento de mayor valor dentro de un arreglo unidimensional.
numeroRecinto = np.argmax(arregloHombres)
numeroRecinto = numeroRecinto + 1
print("El recinto que tiene mayor cantidad de votantes hombres es el
recinto nmero", numeroRecinto)

Importante recordar que la funcin retorna un ndice y adems no existe el recinto cero, por lo
tanto, hay que sumarle 1 al resultado retornado por dicha funcin.

Literal d

Recordemos que, para obtener el promedio de mujeres por recinto, se debe dividir la cantidad
total de mujeres para el nmero de recintos. Luego de haber resulto los literales previos,
encontrar la cantidad de mujeres votantes es algo ya trivial; sin embargo falta encontrar el
nmero de recintos, el cual es prcticamente el nmero de filas de la matriz.
filas, columnas = matriz.shape
numeroMujeres = np.sum(arregloMujeres)
promedio = numeroMujeres/filas
print("El promedio de mujeres que sufragan por recinto es ", promedio)

La funcin shape, utilizada como se muestra en la primera lnea, retorna las dimensiones de la
matriz; por lo tanto obtener as el nmero de filas nos permite posteriormente conseguir el
promedio solicitado.

ltimo problema
totales = np.zeros((1,filas))
for recinto in range(filas):
totales[0,recinto] = np.sum(matriz[recinto,:])
print(totales)

En la primera lnea se construye un arreglo lleno de ceros con un nmero de columnas igual al
nmero de filas de la matriz original (este ltimo dato lo conseguimos en el literal anterior) y
una nica fila; para as representar la matriz solicitada. Sin embargo es necesario conocer
cuntos de todos los recintos tienen una cantidad de votantes mayor a 10mil.

mayoresADiezMil = totales[totales > 10000]


cantidad = mayoresADiezMil.size

En la primera lnea obtenemos un arreglo que contiene a todos los elementos del arreglo
totales mayores a 10.000. Luego, se obtiene la cantidad de elementos que se encuentran en el
arreglo mayoresADiezMil.