_Hasta ahora hemos visto los tipos de datos más básicos que nos ofrece Python: integer, real, complex, boolean, list, tuple... Pero ¿no echas algo de menos? Efectivamente, los arrays. _
En este notebook nos adentraremos en el paquete NumPy: aprenderemos a crear distintos arrays y a operar con ellos.
Un array es un bloque de memoria que contiene elementos del mismo tipo. Básicamente:
Índice | 0 | 1 | 2 | 3 | ... | n-1 | n |
---|---|---|---|---|---|---|---|
Valor | 2.1 | 3.6 | 7.8 | 1.5 | ... | 5.4 | 6.3 |
¿Qué solemos guardar en arrays?
NumPy es un paquete fundamental para la programación científica que proporciona un objeto tipo array para almacenar datos de forma eficiente y una serie de funciones para operar y manipular esos datos. Para usar NumPy lo primero que debemos hacer es importarlo:
import numpy as np
#para ver la versión que tenemos instalada:
np.__version__
'1.12.1'
¿No decíamos que Python era fácil? Pues creemos nuestros primeros arrays:
import numpy as np
# Array de una dimensión
mi_primer_array = np.array([1, 2, 3, 4])
mi_primer_array
array([1, 2, 3, 4])
# Podemos usar print
print(mi_primer_array)
[1 2 3 4]
# Comprobar el tipo de mi_primer_array
type(mi_primer_array)
numpy.ndarray
# Comprobar el tipo de datos que contiene
mi_primer_array.dtype
dtype('int64')
Los arrays de una dimensión se crean pasándole una lista como argumento a la función np.array
. Para crear un array de dos dimensiones le pasaremos una lista de listas:
# Array de dos dimensiones
mi_segundo_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
Esto sería una buena manera de definirlo, de acuerdo con el PEP 8 (indentation):
mi_segundo_array = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
Hemos dicho que NumPy también incorporá funciones. Un ejemplo sencillo:
# Suma
np.sum(mi_primer_array)
10
# Máximo
np.max(mi_primer_array)
4
# Seno
np.sin(mi_segundo_array)
array([[ 0.84147098, 0.90929743, 0.14112001], [-0.7568025 , -0.95892427, -0.2794155 ], [ 0.6569866 , 0.98935825, 0.41211849]])
Y algunas constantes que podemos neccesitar:
np.pi, np.e
(3.141592653589793, 2.718281828459045)
¿Demasiada teoría? vayamos a la práctica. Ya hemos visto que la función np.array()
nos permite crear arrays con los valores que nosotros introduzcamos manualmente a través de listas. Más adelante, aprenderemos a leer ficheros y almacenarlos en arrays. Mientras tanto, ¿qué puede hacernos falta?
# En una dimensión
np.zeros(100)
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
# En dos dimensiones
np.zeros([10,10])
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
np.ones([3, 2])
array([[ 1., 1.], [ 1., 1.], [ 1., 1.]])
np.identity(4)
array([[ 1., 0., 0., 0.], [ 0., 1., 0., 0.], [ 0., 0., 1., 0.], [ 0., 0., 0., 1.]])
NumPy, dame un array que vaya de 0 a 5:
a = np.arange(0, 5)
a
array([0, 1, 2, 3, 4])
Mira con atención el resultado anterior, ¿hay algo que deberías grabar en tu cabeza para simpre? El último elemento no es 5 sino 4
NumPy, dame un array que vaya de 0 a 10, de 3 en 3:
np.arange(0, 11, 3)
array([0, 3, 6, 9])
Si has tenido que usar MATLAB alguna vez, seguro que esto te suena:
np.linspace(0, 10, 21)
array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. , 7.5, 8. , 8.5, 9. , 9.5, 10. ])
En este caso sí que se incluye el último elemento.
Con np.arange()
es posible crear "vectores" cuyos elementos tomen valores consecutivos o equiespaciados, como hemos visto anteriormente. ¿Podemos hacer lo mismo con "matrices"? Pues sí, pero no usando una sola función. Imagina que quieres crear algo como esto:
np.arange()
.np.reshape(array, (dim0, dim1))
.a = np.arange(1, 10)
M = np.reshape(a, [3, 3])
M
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# También funciona como método
N = a.reshape([3,3])
N
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
Ahora que pocas cosas se nos escapan de los arrays, probemos a hacer algunas operaciones. El funcionamiento es el habitual en FORTRAN y MATLAB y poco hay que añadir:
#crear un arra y y sumarle un número
arr = np.arange(11)
arr + 55
array([55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65])
#multiplicarlo por un número
arr * 2
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20])
#elevarlo al cuadrado
arr ** 2
array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100])
#calcular una función
np.tanh(arr)
array([ 0. , 0.76159416, 0.96402758, 0.99505475, 0.9993293 , 0.9999092 , 0.99998771, 0.99999834, 0.99999977, 0.99999997, 1. ])
Si las operaciones involucran dos arrays también se realizan elemento a elemento
#creamos dos arrays
arr1 = np.arange(0, 11)
arr2 = np.arange(20, 31)
#los sumamos
arr1 + arr2
array([20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40])
#multiplicamos
arr1 * arr2
array([ 0, 21, 44, 69, 96, 125, 156, 189, 224, 261, 300])
# >,<
arr1 > arr2
array([False, False, False, False, False, False, False, False, False, False, False], dtype=bool)
# ==
arr1 == arr2 # ¡ojo! los arrays son de integers, no de floats
array([False, False, False, False, False, False, False, False, False, False, False], dtype=bool)
___Hemos aprendido:___
En definitiva:
__¡Quiero más!__Algunos enlaces:
Algunos enlaces en Pybonacci:
Algunos enlaces en otros sitios:
Las siguientes celdas contienen configuración del Notebook
Para visualizar y utlizar los enlaces a Twitter el notebook debe ejecutarse como seguro
File > Trusted Notebook
# Esta celda da el estilo al notebook
from IPython.core.display import HTML
css_file = '../styles/aeropython.css'
HTML(open(css_file, "r").read())