Arreglos N-Dimensionales (Numpy) (1)
Short Description
Descripción: Python...
Description
INTRODUCCIÓN A NUMPY Nivel básico a intermedio
Autores: Jaminson Riascos; Jorge Cedeño; Jorge Murillo (Ayudantes de Fundamentos de Programación)
¿Qué es numpy? Numpy es una librería de Python que contiene objetos y funciones especializadas para computación científica. Provee al lenguaje con herramientas como arreglos n-dimensionales, matrices, funciones de álgebra lineal, transformadas de Fourier, números aleatorios y más. Dado que numpy es una librería, 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 más dimensiones. Cada dimensión del arreglo se conoce como axis o eje. A su vez, el número de axis que tiene un arreglo, es decir el número 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 dimensión o axis tiene longitud 2, mientras que el segundo axis tiene longitud de 3. Atributos de un arreglo Antes de poder revisar cómo crear arreglos con numpy y sus operaciones básicas, 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.
Creación de Arreglos usando numpy Hay varias maneras de crear un arreglo de numpy la más sencilla es usando la función 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:
Además numpy provee funciones especiales para crear arreglos típicos, 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 típico que podría resultar útil es un arreglo cuyos elementos sean una secuencia de números enteros, para esto numpy provee la función arange, esta función es análoga a la función 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 dimensión.
Es posible además crear un arreglo cuyos elementos sean una secuencia de números decimales, para esto numpy nos provee con la función linspace que toma como entrada 3 enteros que representan el inicio de la secuencia, el final de la secuencia y el número 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 sección anterior revisamos como crear arreglos cuyos elementos sean una secuencia de números, sin embargo los métodos que nos provee numpy para la creación 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 librería nos provee con la función reshape que toma como entrada las nuevas dimensiones del arreglo, es decir que cada número 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 multiplicación de los números en la entrada de la función reshape debe ser igual a size del arreglo original.
Operaciones Básicas Las operaciones aritméticas como la suma, resta, potenciación y demás se efectúan 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:
Añadir 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 añadir nuevos elementos a un arreglo o eliminar elementos del mismo, para esto Python nos provee las siguientes funciones: •
append: Permite añadir un nuevo elemento a un arreglo. Toma como entradas el arreglo original y los elementos a añadir. La función devuelve una copia de los elementos del arreglo original con los nuevos elementos añadidos. 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 transposición, para esto numpy nos provee la función 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 Básicas Las operaciones aritméticas 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 multiplicación matricial de las mismas. Por ejemplo:
Note que para la multiplicación matricial, se deben usar matrices con las dimensiones correctas
Ejercicio de Aplicación Escriba un programa que dado un arreglo bidimensional con las notas de todos los estudiantes registrados en la materia fundamentos de programación, calcule el promedio de cada paralelo en el examen del primer parcial materia. Con esta información, 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, además en cada paralelo hay exactamente el mismo número de estudiantes N, finalmente existen M paralelos. Resolución:
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 números 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 quisiéramos imprimir cada 3 números empezando entre el segundo valor y el noveno. (recordar que el primer valor sería el que tiene índice 0, y el noveno tendría 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, [10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33], [40, 41, 42, 43]]))
1,
2,
3],
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
Matemát.
Fisica.
Quimica.
Anatomia.
Est. 0 Est. 1 Est. 2 Est. 3 Est. 4 Est. 5
100 65 74 98 40 87
80 78 96 87 65 49
94 76 65 90 59 67
75 87 43 95 72 81
Donde las filas representan 6 estudiantes los cuales están viendo 4 materias. Represente estas calificaciones en una matriz en numpy.
1) El profesor de la materia de física se equivocó al colocar la calificación del Est. 3 que en lugar de ser 87 era 97, corríjala usando lo aprendido. 2) En Química, los 4 primero estudiantes presentaron el mejor proyecto, como recompensa todos recibirán un 100 en la calificación. Realice este cambio usando una solo línea de código 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
Solución: 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 cómo 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 numérico 1. Una forma muy básica, 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 función 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 pragmáticamente sacar el tamaño de cada dimensión del arreglo para poder recorrerlo. Este código nos daría el arreglo z nuevo: [[
1
7
1]
[
4
1
9]
[
8
6
1]]
Una forma hacer lo mismo rápido 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 condición que queremos que un elemento cumpla para ser reemplazado. En este caso queremos reemplazar los elementos que sean iguales a 5, así que la condición es z==5. Después de los corchetes escribimos es signo de asignación 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]
View more...
Comments