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:
In [1]:
import numpy as np
#para ver la versión que tenemos instalada:
np.__version__
Out[1]:
¿No decíamos que Python era fácil? Pues creemos nuestros primeros arrays:
In [2]:
import numpy as np
In [3]:
# Array de una dimensión
mi_primer_array = np.array([1, 2, 3, 4])
mi_primer_array
Out[3]:
In [4]:
# Podemos usar print
print(mi_primer_array)
In [5]:
# Comprobar el tipo de mi_primer_array
type(mi_primer_array)
Out[5]:
In [6]:
# Comprobar el tipo de datos que contiene
mi_primer_array.dtype
Out[6]:
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:
In [7]:
# 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):
In [8]:
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:
In [9]:
# Suma
np.sum(mi_primer_array)
Out[9]:
In [10]:
# Máximo
np.max(mi_primer_array)
Out[10]:
In [11]:
# Seno
np.sin(mi_segundo_array)
Out[11]:
Y algunas constantes que podemos neccesitar:
In [12]:
np.pi, np.e
Out[12]:
¿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?
In [13]:
# En una dimensión
np.zeros(100)
Out[13]:
In [14]:
# En dos dimensiones
np.zeros([10,10])
Out[14]:
In [15]:
np.empty(10)
Out[15]:
In [16]:
np.ones([3, 2])
Out[16]:
In [17]:
np.identity(4)
Out[17]:
NumPy, dame un array que vaya de 0 a 5:
In [18]:
a = np.arange(0, 5)
a
Out[18]:
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:
In [19]:
np.arange(0, 11, 3)
Out[19]:
Si has tenido que usar MATLAB alguna vez, seguro que esto te suena:
In [20]:
np.linspace(0, 10, 21)
Out[20]:
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))
.
In [21]:
a = np.arange(1, 10)
M = np.reshape(a, [3, 3])
M
Out[21]:
In [22]:
# También funciona como método
N = a.reshape([3,3])
N
Out[22]:
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:
In [23]:
#crear un arra y y sumarle un número
arr = np.arange(11)
arr + 55
Out[23]:
In [24]:
#multiplicarlo por un número
arr * 2
Out[24]:
In [25]:
#elevarlo al cuadrado
arr ** 2
Out[25]:
In [26]:
#calcular una función
np.tanh(arr)
Out[26]:
Si las operaciones involucran dos arrays también se realizan elemento a elemento
In [27]:
#creamos dos arrays
arr1 = np.arange(0, 11)
arr2 = np.arange(20, 31)
In [28]:
#los sumamos
arr1 + arr2
Out[28]:
In [29]:
#multiplicamos
arr1 * arr2
Out[29]:
In [30]:
# >,<
arr1 > arr2
Out[30]:
In [31]:
# ==
arr1 == arr2 # ¡ojo! los arrays son de integers, no de floats
Out[31]:
Hemos aprendido:
En definitiva:
¡Quiero más!Algunos enlaces:
Algunos enlaces en Pybonacci:
Algunos enlaces en otros sitios: