domingo, 27 de diciembre de 2020

1) Trabajando con la Librería Numpy de Python. Creando Arrays.

 








Trabajando con la Librería Numpy en Python.

Aunque nos es muy cómodo trabajar con las listas en Python, cuando queremos realizar cálculos complejos o ganar velocidad en los programas, la librería estándar se queda corta. Es muy flexible, pero también lenta a la hora de realizar cálculos. Puedes ver la enorme diferencia de tiempo de ejecución en este ejemplo.

Si lo abres encontrarás el código en Python para calcular cual es el número pi usando el método Montecarlo. Lo que nos interesa es que ambos programas generan y trabajan en su ejecución con 16 millones de números, pero que mientras que el programa en python estandar tarda su tiempo, el que utiliza la libreria numpy lo realiza en nada, casi sin esfuerzo.

No voy a entrar en porque esta drástica reducción de tiempo, ya que no es objeto de este curso. Solo diré que la biblioteca Numpy nos mejora sustancialmente la velocidad al trabajar con datos. Nos introduce también un nuevo tipo de estos, como son las matrices o "arrays". Esto nos permitirá trabajar con datos multidimensionales de forma muy rápida, además de facilitarnos herramientas para trabajar con álgebra lineal, números aleatorios etc. Además se integra fenomenalmente con MatPlotLib a la hora de hacer gráficas de los mismos.

Crear arrays o matrices en Numpy.


Lo primero que tenemos que tener claro es que un array o matriz en Numpy siempre está formada por un número fijo de elementos y todos estos elementos se corresponden al mismo tipo de datos. Tanto el número de elementos como su tipo, se especifican al crear la matriz. Vamos a hablar de matriz porque creo que es más intuitivo, aunque realmente un array no es una matriz, abarca mucho más.

Aunque el número de elementos es fijo, la forma de la matriz se puede cambiar siempre que el número de elementos siga siendo el mismo.

Creando Matrices o Arrays.


La forma más sencilla de construir arrays es pasando los elementos directamente como argumento.

Por ejemplo para crear una matriz unidimensional de cinco elementos (9,8,7,6,5) podemos hacerlo de la siguiente forma.

>>> import numpy
# Importamos la librería Numpy

>>> m = numpy.array((9,8,7,6,5))
>>> m
array([9,8,7,6,5])

Esto ha generado una matriz unidimensional con cinco elementos de tipo entero.

Si no especificamos el tipo de los elementos que componen la matriz este se determina automáticamente a partir de los datos introducidos. En el ejemplo anterior, como todos eran números enteros (integer), el tipo de dato establecido por numpy automáticamente es entero. Ahora bien, si en el ejemplo anterior hubiera habido un número flotante, pej. (9,8,3.5,6,5) la matriz se hubiera creado de la misma forma solo que el tipo de datos seleccionado automáticamente para todos los elementos por numpy sería flotante (float).

El primer argumento de la función array() lo constituyen los elementos de la matriz. Puede ser una lista única (o tupla) o una lista anidada de listas de tamaño uniforme que imitan la estructura de una matriz multidimensional.

El segundo argumento de array() es el tipo de datos que se usarán en la matriz. Como hemos visto es opcional, si no lo ponemos, numpy lo establecerá automáticamente. El tipo de datos puede ser cualquiera de los tipos básicos de datos de python (int, float etc) o pueden ser mas científicos como los números complejos (complex) etc.






También podríamos crear la matriz desde una lista. Por ejemplo creando una matriz de 2 filas X 3 columnas de números complejos a partir de una lista dada.

>>> import numpy
# Importamos la librería Numpy

>>> lista = [(9,8,7),(6,5,4)]
>>> m = numpy.array(lista, complex)
>>> print(m)
[[9.+0.j 8.+0.j 7.+0.j]
 [6.+0.j 5.+0.j 4.+0.j]]


Si queremos saber la forma de la matriz usaremos la instrucción shape.

Con los datos del ejemplo anterior:

>>> print(m.shape)
(2, 3)

Y si lo que quisiéramos saber fuera el número de elementos, usaremos la instrucción size.

>>> print(m.size)
6


Funciones auxiliares que nos pueden ayudar a crear arrays.


La biblioteca NumPy nos facilita unas cuantas funciones auxiliares que nos permiten crear matrices.

Dos de las funciones más útiles para crear matrices con elementos secuenciales son arange y linspace.

1) Muy similar a la función range de python, numpy.arange() crea una matriz con elementos secuenciales que se reparten de forma uniforme en un intervalo dado.

Por ejemplo si queremos una matriz unidimensional con 10 elementos que se repartan de una forma uniforme podemos utilizar el siguiente código.

Nota. (En todos los ejemplos ya se supone que hemos importado la librería numpy previamente)

>>> matriz = numpy.arange(10)
>>> matriz
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> print(matriz)
[0 1 2 3 4 5 6 7 8 9]


Opcionalmente, también podemos especificar los valores iniciales y finales del rango a crear, así como un incremento o decremento en cada paso al crear un valor. Por ejemplo si queremos crear una matriz con elementos del 1 al 10 en el que cada elemento sea igual al anterior pero sumándole 2 lo podemos hacer con (numpy.arange(inicio, fin, paso)):

>>> m1 = numpy.arange(1,10,2)
>>> print(m1)
[1 3 5 7 9]

Los argumentos inicio, fin y paso no tienen que ser números enteros, también pueden ser números flotantes, por ejemplo.

2) Otra necesidad muy frecuente es la de tener que crear un número determinado de valores espaciados uniformemente dentro de un intervalo. Pues esto es justo lo que hace la función numpy.linspace()

Veámoslo con un ejemplo. Si queremos obtener una distribución uniforme con 5 elementos que vaya desde -3 a 3 usaremos esta instrucción:

>>> m2 = numpy.linspace(-3,3,5)
>>> print(m2)
[-3.  -1.5  0.   1.5  3. ]


3) También podemos crear una matriz de las dimensiones que queramos iniciándola con ceros, unos o el valor que queramos.

* Matriz de dos filas y cinco columnas cuyos elementos sean todos ceros.

>>> m3 = numpy.zeros((2,5))
>>> m3
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

* Matriz de dos filas y cinco columnas cuyos elementos sean todos unos.

>>> m4 = numpy.ones((2,5))
>>> m4
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])

* Matriz de cuatro filas por cuatro columnas rellenada con el número 3.6

>>> m5 = numpy.full((4,4),3.6)
>>> print(m5)
[[3.6 3.6 3.6 3.6]
 [3.6 3.6 3.6 3.6]
 [3.6 3.6 3.6 3.6]
 [3.6 3.6 3.6 3.6]]

4) Además de valores numéricos NumPy soporta el almacenar valores no numéricos como por ejemplo datos de tipo string o texto

>>> m6 = numpy.array(["rojo","verde","azul"])
>>> print(m6)
['rojo' 'verde' 'azul']

En alguna ocasión te puede ser útil obtener una matriz con los caracteres de una palabra.

>>> palabra = "estereoscopico"
>>> m7 = numpy.array(palabra,dtype='c')
>>> print(m7)
[b'e' b's' b't' b'e' b'r' b'e' b'o' b's' b'c' b'o' b'p' b'i' b'c' b'o']


Para finalizar este capítulo vamos a ver con un ejercicio un resumen de lo más importante de lo anterior.


EJERCICIO

1) Comencemos creando una lista de Python que contenga números enteros y flotantes y luego construyamos una matriz Numpy con ella. 

2 ) Luego creemos una matriz unidimensional que contenga todos los números de -2 a 2 con una separación de 0.2 Utilizaremos los argumentos opcionales de inicio y paso opcionales de la función np.arrange().

3) Para continuar, crearemos una matriz unidimensional que contenga 11 valores que estén distribuidos de forma igualitaria entre 0.5 y 1.5 

4) Y ya para acabar tomaremos caracteres de una cadena de Python y a partir de ella haremos una matriz de Numpy que contenga cada uno de los caracteres de forma individual.


SOLUCIÓN


import numpy as np

#1)
#lista que contiene números enteros y flotantes.
lista=[1,2,3,4,5.0,6.0,7.0]

#creamos un array de numpy con la lista anterior
n_list = np.array(lista)

#2) np.arange genera numero igual que range pero se le pueden pasar números decimales.
a = np.arange(-2.0, 2.0, 0.2)
print(a)

#3) np.linspace genera números pero en un intervalo que definimos nosotros
# por ejemplo creamos un intervalo de 11 valores entre 0.5 y 1.5
b = np.linspace(0.5,1.5,11)
print(b)

#4 muestra un string en numpy como caracteres
string = "El balonmano es un buen deporte"
s=np.array(string, dtype='c')
print(s)



Y hasta aquí el primer capítulo. 


Próximo Post. Accediendo a los datos de las matrices con Numpy. Copia de matrices.

No hay comentarios:

Publicar un comentario