You are on page 1of 16

INTRODUCCIN A NUMPY

Nivel bsico a intermedio

Autores: Jaminson Riascos; Jorge Cedeo; Jorge Murillo (Ayudantes de Fundamentos de


Programacin)
Qu es numpy?

Numpy es una librera de Python que contiene objetos y funciones especializadas para computacin
cientfica. Provee al lenguaje con herramientas como arreglos n-dimensionales, matrices, funciones
de lgebra lineal, transformadas de Fourier, nmeros aleatorios y ms.

Dado que numpy es una librera, es necesario importarla antes de poder usar los objetos y funciones
que posee.

Arreglos en numpy

Un arreglo es un conjunto ordenado de elementos, todos del mismo tipo de dato, indexados por una
tupla de enteros positivos.

Los arreglos de Numpy pueden tener una o ms dimensiones. Cada dimensin del arreglo se conoce
como axis o eje. A su vez, el nmero de axis que tiene un arreglo, es decir el nmero de
dimensiones, tiene como nombre rank.

Por ejemplo:

El rank del arreglo mostrado es 2, ya que es un arreglo bidimensional, es decir tiene dos axis. La
primera dimensin o axis tiene longitud 2, mientras que el segundo axis tiene longitud de 3.

Atributos de un arreglo

Antes de poder revisar cmo crear arreglos con numpy y sus operaciones bsicas, es necesario
indicar algunas de las propiedades que tiene un arreglo de numpy. Numpy nos provee con
sentencias para obtener los valores de dichas propiedades, es importante recordar que estas
sentencias no son funciones as que no llevan llaves al final.

Para fines demostrativos obtendremos las propiedades del arreglo anterior al que llamaremos A. Las
propiedades del arreglo A son:

ndim : Nos permite obtener el rank del arreglo

shape: Nos permite obtener las dimensiones del arreglo. Devuelve una tupla de enteros con
la longitud de cada axis del arreglo.

size: Nos permite obtener el numero total de elementos en el arreglo.

dtype: Nos permite obtener el tipo de datos de los elementos contenidos en el arreglo.
Creacin de Arreglos usando numpy

Hay varias maneras de crear un arreglo de numpy la ms sencilla es usando la funcin array de
numpy que toma como entrada un tupla o lista de Python y devuelve una copia de la lista o tupla
pero de tipo array.

Por ejemplo:

Adems numpy provee funciones especiales para crear arreglos tpicos, estas funciones son:

zeros: Permite crear un arreglo lleno de ceros, recibe como entrada una tupla con la
longitud de los axis del arreglo. Por ejemplo:

ones: Permite crear un arreglo lleno de unos, recibe como entrada una tupla con la longitud
de los axis del arreglo. Por ejemplo:

Otro arreglo tpico que podra resultar til es un arreglo cuyos elementos sean una secuencia de
nmeros enteros, para esto numpy provee la funcin arange, esta funcin es anloga a la funcin
range con la diferencia de que en lugar de devolver una lista, devuelve un arreglo de numpy.
Por ejemplo:

Note que el arreglo creado es de rank 1, es decir que solo tiene un axis o dimensin.
Es posible adems crear un arreglo cuyos elementos sean una secuencia de nmeros decimales, para
esto numpy nos provee con la funcin linspace que toma como entrada 3 enteros que representan
el inicio de la secuencia, el final de la secuencia y el nmero de elementos de la secuencia
respectivamente .
Por ejemplo:

Note que el arreglo devuelto es de rank 1, es decir que solo tiene un axis o dimension.

Alterar dimensiones de un arreglo

En la seccin anterior revisamos como crear arreglos cuyos elementos sean una secuencia de
nmeros, sin embargo los mtodos que nos provee numpy para la creacin de los mismo solo
devuelven arreglos unidimensionales, a menudo nos ser necesario cambiar las dimensiones de un
arreglo, como en el caso descrito anteriormente, por lo que la librera nos provee con la funcin
reshape que toma como entrada las nuevas dimensiones del arreglo, es decir que cada nmero
representar la longitud de un axis del arreglo.
Por ejemplo:

Note que el size del nuevo arreglo es igual al del arreglo original por lo que la multiplicacin de los
nmeros en la entrada de la funcin reshape debe ser igual a size del arreglo original.
Operaciones Bsicas

Las operaciones aritmticas como la suma, resta, potenciacin y dems se efectan elemento a
elemento para los arreglos de numpy, es decir que multiplicar un entero por un arreglo producir un
nuevo arreglo con los cada uno de los elementos de arreglo original multiplicado por el entero.
Por ejemplo:

Ademas las operaciones aritmeticas entre arreglos tambien se efectuan elemento a elemento.
Por ejemplo:

Para realizar una multiplicacion matricial entre dos arreglos, numpy nos provee la funcion dot, que
toma como entrada los arreglos a multiplicar y devuelve un nuevo arreglo con el resultado.
Por ejemplo:
Suma de los elemetos en un axis de un arreglo

Dado que los arreglos de numpy usualmente son usados para almacenar numeros, cuenta con
funciones especialisadas que solo se pueden realizar sobre arreglos cuyos elementos sean de algun
tipo numero. Este es el caso de la funcion sum que suma todos los elementos de cada fila o columna
de un arreglo, la funcion toma como entrada el axis del que se quiere sumar los elementos.

Por ejemplo:

Aadir elementos a un arreglo

En secciones anteriores revisamos como alterar las dimensiones de un arreglo sin modificar sus
elementos, sin embargo a menudo nos ser til aadir nuevos elementos a un arreglo o eliminar
elementos del mismo, para esto Python nos provee las siguientes funciones:

append: Permite aadir un nuevo elemento a un arreglo. Toma como entradas el arreglo
original y los elementos a aadir. La funcin devuelve una copia de los elementos del
arreglo original con los nuevos elementos aadidos.
Por ejemplo:

Note que el nuevo arreglo es de rank 1, es decir solo tiene una dimension.

delete: Permite eliminar elementos de un arreglo. Toma como entradas el arreglo original y
una lista con los indicies de los numero a eliminar del arreglo.
Por ejemplo:

Note que los ndices de los elementos a eliminar del arreglo original, son los indicies que los
elementos tuvieran si el arreglo fuera unidimensional.
Otro ejemplo de alteraciones de a los elementos de un arreglo es la transposicin, para esto numpy
nos provee la funcin transpose que nos permite transponer los elementos de un arreglo.
Por ejemplo:

Matrices

Las matrices de numpy son muy parecidas a los arreglos, con la diferencia de que son nicamente
bidimensionales, es decir tienen 2 axis.
Por ejemplo:
Operaciones Bsicas

Las operaciones aritmticas para una matriz de numpy son todas operaciones matriciales, es decir
que si se multiplica un escalar por una matriz el resultado ser una nueva matriz con los elementos
de la matriz original multiplicados por el escalar, sin embargo si se multiplican dos matrices, el
resultado ser la multiplicacin matricial de las mismas.

Por ejemplo:

Note que para la multiplicacin matricial, se deben usar matrices con las dimensiones correctas
Ejercicio de Aplicacin

Escriba un programa que dado un arreglo bidimensional con las notas de todos los estudiantes
registrados en la materia fundamentos de programacin, calcule el promedio de cada paralelo en el
examen del primer parcial materia. Con esta informacin, luego construya un nuevo arreglo
bidimensional en el que cada columna tenga como primer elemento el promedio de un paralelo,
seguido de todas las notas del mismo. Asuma que en cada fila del arreglo original se encuentran las
calificaciones de cada estudiante de un paralelo, adems en cada paralelo hay exactamente el
mismo nmero de estudiantes N, finalmente existen M paralelos.

Resolucin:

import numpy as np
# arreglo original con notas de estudiantes
notas = np.array([[98,96,56,20],[11,53,85,93],[78,46,34,73],[70,60,43,100]])
M = notas.shape[0] # numero de paralelos
N = notas.shape[1] # numero de estudiantes
# se calcula el promedio de las notas por paralelo
promedios = notas.sum(axis=1)/(M)
# se transpone el arreglo de notas
notasTraspuesta = notas.transpose()
# Se combina el arreglo de notas traspuestas con el arreglo de promedios

resultado = np.append(promedios,notasTraspuesta)
resultado = resultado.reshape((5,4))
print(resultado)
Slicing de un arreglo de numpy

Primero crearemos un array en la variable a con nmeros del 0 al 9

>>> a = np.arange(10)

al imprimir a obtendremos lo siguiente

>>> print a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

si deseamos imprimir el valor en el ndice 3


>>> print a[3]
4

ahora si solo queremos imprimir los 5 primeros valores

>>> print a[:5]


[0 1 2 3 4]

si queremos imprimir los del sexto valor en adelante

>>> print a[5:]


[5 6 7 8 9]

si queremos imprimir los valores del 3 al 7

>>> print a[3:8]


[3 4 5 6 7]

notar que al hacer slicing [a : b] el valor en el ndice a SI se incluye y el valor en el ndice b NO.

Si quisiramos imprimir cada 3 nmeros empezando entre el segundo valor y el noveno. (recordar
que el primer valor sera el que tiene ndice 0, y el noveno tendra de ndice 8)

>>> print a[1:9:3]


[1 4 7]

Ahora queremos reemplazar por 100 a los valores desde el tercero al octavo, saltado un lugar

>>> a[2:9:2]=100

imprimimos a para comprobar

>>> print a
[ 0 1 100 3 100 5 100 7 100 9]

para imprimir el arreglo en sentido opuesto solo debemos de escribir

>>> print a[::-1]


[ 9 100 7 100 5 100 3 100 1 0]
__________________________________________________________

Ahora procederemos a trabajar en dos dimensiones, para esto crearemos la siguiente matriz de 5x4

>>> b = np.array(array([[ 0, 1, 2, 3],


[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43]]))

para obtener un valor solo debemos de indicar sus ndices [x,y]

>>> print b[2,3]


23

Si deseo obtener la tercera columna

>>> print b[:,2]


[ 2 12 22 32 42])

La tercer fila

>>> print b[2,:]


[20 21 22 23]

Ejercicio:

Tomando en cuenta que tenemos:

NOTAS Matemt. Fisica. Quimica. Anatomia.


Est. 0 100 80 94 75
Est. 1 65 78 76 87
Est. 2 74 96 65 43
Est. 3 98 87 90 95
Est. 4 40 65 59 72
Est. 5 87 49 67 81

Donde las filas representan 6 estudiantes los cuales estn viendo 4 materias. Represente estas
calificaciones en una matriz en numpy.

1) El profesor de la materia de fsica se equivoc al colocar la calificacin del Est. 3 que en lugar
de ser 87 era 97, corrjala usando lo aprendido.
2) En Qumica, los 4 primero estudiantes presentaron el mejor proyecto, como recompensa
todos recibirn un 100 en la calificacin. Realice este cambio usando una solo lnea de
cdigo usando lo aprendido
3) El Est.4 solicita que se le de las calificaciones de las 3 primeras materias, usando slicing
obtener la fila del Est.4
Solucin:

c = np.array([[100, 80, 94, 75], [65, 78, 76, 87], [74, 96, 65, 43],
[98, 87, 90, 95], [40, 65, 59, 72], [87, 49, 67, 81]])

1)

>>> c[3,1]=97

2)

>>> c[:4,3]=100

3)
>>> print c[4, :3]
Reemplazo de Valores

Ya sabiendo cmo crear arreglos en Numpy y como acceder a los elementos de estos directamente
usando los ndices, vamos a tratar el tema de buscar y reemplazar valores en un arreglos.

Supongamos que tenemos el siguiente arreglo llamado z:

z=

[[ 5 7 1]

[ 4 5 9]

[ 8 6 5]]

Ahora que supongamos que queremos cambiar un valor especifico del arreglo por otro. Por ejemplo
digamos que queremos cambiar los valores de 5 por el valor numrico 1.

Una forma muy bsica, pero efectiva de hacerlo es usando un lazo doble con un condicional.
for i in range (z.shape[0]):
for j in range (z.shape[1]):
if z[i,j]==5:
z[i,j]=1

NOTA: La funcin z.shape nos da una tupla con las dimensiones del arreglo. En este caso z.shape nos
devuelve la tupla (2,3). Asi que z.shape[0] es igual a 2 y z.shape[1] es igual a 3. Esta es una manera
de pragmticamente sacar el tamao de cada dimensin del arreglo para poder recorrerlo.

Este cdigo nos dara el arreglo z nuevo:

[[ 1 7 1]

[ 4 1 9]

[ 8 6 1]]

Una forma hacer lo mismo rpido seria la siguiente:


z[z==5]=1

En esta sentencia lo que hacemos es escribir el nombre del arreglo (z) abrir corchetes, y dentro de
los corchetes escribir la condicin que queremos que un elemento cumpla para ser reemplazado. En
este caso queremos reemplazar los elementos que sean iguales a 5, as que la condicin es z==5.
Despus de los corchetes escribimos es signo de asignacin y escribimos el nuevo valor del
elemento.

Para dar otro ejemplo: si tenemos el arreglo llamado b:


b=

[[ 15 27 31]

[ 34 16 29]]

Si queremos reemplazar los elementos menores a 20 con el valor 0, podemos usar un doble lazo y
condicional:
for i in range (b.shape[0]):
for j in range (b.shape[1]):
if b[i,j]<20:
b[i,j]=0

Y esto nos dara el arreglo

[[ 0 27 31]

[ 34 0 29]]

Sin embargo tambin podemos hacer los mismo de la forma:

b[b<20]=0

y tendramos el mismo resultado.

Con las matrices de Numpy, los procedimientos son exactamente los mismos.

Indexacion Avanzada

Nosotros sabemos que se puede acceder a un elemento especifico de un arreglo o una matriz
escribiendo los ndice en corchetes. Sin embargo si queremos acceder a varios elementos a la vez
para reemplazarlos u solo para obtenerlos en una lista, podemos hacer uso de la indexacin
avanzada. Por ejemplo para el arreglo h:

h=

[[ 1 2]

[ 3 4]

[ 4 6]]

Si queremos acceder a los valores 2, y 3 podemos escribir los ndices de las filas al principio y los
ndices de las columnas despus:

h[ [ 0,1 ],[ 1,0 ] ]

Lo cual nos devolvera un arreglo

[ 2 3]

Dense cuenta que los pares de los mismo colores corresponden a los ndices del elemento. Por
ejemplo, si escribiramos

h[0,1]
Obtendremos como resultado 2.

Y si escribimos

h[1,0]

Obtendremos como resultado 3.

Si tenemos la matriz k

k=

h=

[[ 1 2 7]

[ 3 5 9]

[ 8 6 4]]

Y quedemos acceder a los elementos 7 , 8 y 4; nos fijamos primero que los ndices de estos son [0,1]
, [2,0] , [2,2] y escribimos

h[ [0,2,2],[1,0,2] ]

Lo que nos devolver como resultado:

[7 8 4]

Ejercicio:

Con la funcin np.ranndom.rand se puede crear un arreglo multidimensional cuyos elementos son
valores aleatorios en el rango [0,1). Por ejemplo, si escribimos el cdigo
z = np.random.rand(2,2)

Obtendremos como resultado:

z=

[[ 0.68610417 0.28409128]

[ 0.82473996 0.11130534]]

OJO: Los valores de los elementos de este arreglo van a ser diferentes cada vez que se llame esa
misma funcin.

Este arreglo puede ser multiplicado por un entero, de la misma forma que una matriz. Por ejemplo
si tenemos
x = 3*z

Esto nos dara como resultado:

[[ 2.05831252 0.85227383]

[ 2.47421987 0.33391601]]

Donde cada elemento tendr un valor entre cero y el entero por el cual multiplicamos el arreglo. En
este caso, cada elemento tendr un valor entre cero y tres [0,3).
Cree un arreglo de dos dimensiones de tamao 5x5 con valores aleatorios entre cero y seis [0,6).
Ahora reemplace los elementos del arreglo menores o iguales a 3 por 0 y los mayores a 3 con 6. Esto
es, si un elemento tiene como valor 2.53, reemplcelo con el valor de 0. y si tiene un valor de 4.434
reemplcelo con 6.

Solucin

Para crear el arreglo aleatorio de 10x10 con valores entre cero y seis escribimos:
z = 4*np.random.rand(10,10)

Un posible arreglo que este cdigo nos dara es:

[[ 1.37491988 0.37024527 3.28328868 2.90581454 0.11617209]

[ 1.00241684 1.37509791 2.20567422 3.05206273 2.11465552]

[ 0.52326682 3.89896397 3.67179981 2.30790474 0.23935823]

[ 3.10276963 0.44270837 0.23731595 0.05955062 3.36297851]

[ 0.63078976 2.10670295 3.16441144 1.16989134 3.58134986]]

Ahora para reemplazar los valores, hay que primero que pensar en las condiciones necesarias para
reemplazar un valor. Las condiciones para reemplazar un valor z son dos:

z= 0 si z<=3

z=6 si z>3

Entonces simplemente escribimos


z[z<=3] = 0
z[z>3] = 6

Y esto nos dara el arreglos

z=

[[ 0 0 6 0 0]

[0 6 6 0 0]

[6 0 0 0 6]

[0 0 6 0 6]]

You might also like