La biblioteca numpy se importa
In [2]:
import numpy as np
se acostumbra llamarla np para facilitar la escritura de referencias a los objetos que contiene la librería.
El objeto más importante en numpy es el arreglo n-dimensional (ndarray) que permite representar facilmente vectores, matrices y tensores.
Se puede crear un ndarray a partir de listas, por ejemplo:
In [64]:
# Una matriz fila (matriz 1x3)
a = np.array( [ [3,2,1] ] )
type(a), a.size, a.ndim, a.shape, a.dtype, a.data
Out[64]:
In [65]:
a
Out[65]:
In [66]:
# Para un vector se excluyen los cochetes externos
a2 = np.array([3,2,1])
type(a2), a2.size, a2.ndim, a2.shape, a2.dtype
Out[66]:
In [67]:
a2
Out[67]:
In [69]:
# Agregando un eje a un vector shape=(3,) se convierte en una matriz con shape=(3,1)
a2[:, np.newaxis]
Out[69]:
In [7]:
# Una matriz 2x3
b = np.array( [ [4.,5,6],
[7,8,9] ] )
type(b), b.size, b.ndim, b.shape, b.dtype
Out[7]:
In [8]:
# Tambien se puede utilizar una lista de tuplas
b2 = np.array( [ (4.,5,6), (7,8,9) ] )
type(b2), b2.size, b2.ndim, b2.shape, b2.dtype
Out[8]:
In [58]:
# Un vector a partir de un rango de valores
c = np.arange(10)
type(c), c.size, c.ndim, c.shape, c.dtype
Out[58]:
In [59]:
c
Out[59]:
In [61]:
# El metodo tile permite crear una matriz replicando los elementos
np.tile(c, (2,1))
Out[61]:
In [11]:
# Un vector a partir de un rango indicando inicio, fin y paso
d = np.arange(10,50,4)
d
Out[11]:
La función linspace permite crear vectores dividiendo un intervalo uniformemente
In [12]:
# Observar que se incluyen los extremos
e = np.linspace(10,50,12)
e
Out[12]:
In [13]:
# O en caso de necesitar construir una escala logaritmica
f = np.logspace(1,3,10) # desde 10**1 hasta 10**3
f
Out[13]:
Un ndarray se puede reorganizar preservando los datos utilizando el método reshape
In [14]:
d.reshape((2,5))
Out[14]:
In [15]:
b.reshape((6,1))
Out[15]:
Existen métodos para instanciar estructuras de uso frecuente
In [16]:
# La matriz de ceros
np.zeros( (3,4) )
Out[16]:
In [17]:
# La matriz de unos
np.ones((2,6))
Out[17]:
In [18]:
# Una matriz sin inicializar
np.empty((2,3))
Out[18]:
In [19]:
# La matriz identidad
np.eye(5)
Out[19]:
Las operaciones de apilamiento (stacking) permiten unir estructuas verticalmente u horizontalmente
In [20]:
p = np.empty((2,3))
q = np.ones((2,3))
In [21]:
# Apilamiento vertical
np.vstack((p,q))
Out[21]:
In [22]:
# Apilamiento horizontal
np.hstack((p,q))
Out[22]:
NumPy asume un tipo por defecto, basado en los datos con los que se inicializa el arreglo. Se puede especificar el tipo de dato en caso de desear un tipo particular.
In [23]:
# Tipo por defecto: int64
a = np.array( [ [3,2,1] ] )
a.dtype
Out[23]:
In [24]:
# Usar otros tipos
a2 = np.array( [ [3,2,1] ], np.int32 )
a2.dtype
Out[24]:
In [25]:
a3 = np.array( [ [3,2,1] ], np.float )
a3.dtype
Out[25]:
In [26]:
a4 = np.array( [ [3,2,1] ], np.float32 )
a4.dtype
Out[26]:
In [27]:
b = np.linspace(1,10,20)
b.dtype
Out[27]:
In [28]:
b
Out[28]:
In [29]:
b2 = np.linspace(1,10,20, dtype=np.int64)
b2.dtype
Out[29]:
In [30]:
# Observar que los valores se redondean hacia abajo
b2
Out[30]:
In [31]:
# Los tipos string por defecto utilizan formato unicode. Observar que los numeros se toman como strings
c = np.array( [ ['hola',12], ['adios',21] ] )
c
Out[31]:
El tipo datetime64 permite representar fechas y horas. También se puede utilizar en los métodos arange()
In [32]:
hoy = np.datetime64('2017-09-26')
manana = np.datetime64('2017-09-27')
hoy, manana
Out[32]:
In [33]:
dosDias = np.array( [hoy, manana] )
dosDias
Out[33]:
In [34]:
unaSemana = np.arange('2017-09-24', '2017-10-01', dtype='datetime64')
unaSemana
Out[34]:
In [35]:
# Fecha y hora
ya = np.datetime64('2017-09-26T15:21:01')
ya
Out[35]:
In [36]:
# Rango de fechas con pasos de 1 hora
horas = np.arange('2017-09-26T00:00', '2017-09-26T23:59', dtype='datetime64[h]' )
horas
Out[36]:
In [37]:
# Un rango de dias
dias = np.arange('2017-02', '2017-03', dtype='datetime64[D]')
dias
Out[37]:
In [38]:
# Datos tipo complejo
complejos = np.array([ 1+2j, -1-2j, 3., -7j ])
complejos.dtype
Out[38]:
In [39]:
# Datos tipo booleano
booleanos = np.array([ True, False ])
booleanos.dtype
Out[39]:
In [40]:
cadenas = np.array(['one','two','three'])
cadenas.dtype
Out[40]:
Para indicar un rango de indices se utiliza la notación inicio:fin:paso es cada una de las dimensiones. Si se omite el paso se asume que es 1, si se omite el inicio se asume que es desde el indice 0 y si se omite el fin se asume que es hasta la longitud de la correspondiente dimensión. Un índice negativo se asume que se resta de la longitud de la dimensión correspondiente.
Como un primer ejemplo, considerese el arreglo unidimensional dias el ejemplo anterior:
In [41]:
dias[0]
Out[41]:
In [42]:
dias[-1]
Out[42]:
In [43]:
dias[0:3]
Out[43]:
In [44]:
dias[-3:-1]
Out[44]:
In [45]:
dias[:4]
Out[45]:
In [46]:
dias[-3:]
Out[46]:
In [47]:
dias[1:10:2]
Out[47]:
Considerese ahora una matriz bidimensional 4x5
In [48]:
m = np.arange(1,21).reshape((4,5))
m
Out[48]:
In [49]:
# Para seleccionar una de las columnas
m[:,2]
Out[49]:
In [50]:
# Para seleccionar una de las filas
m[2,:]
Out[50]:
In [51]:
# Un rango dentro de la columna
m[1:3,2]
Out[51]:
In [52]:
# Un rango dentro de la fila
m[2,3:5]
Out[52]:
In [53]:
# El último elemento de la última fila
m[-1,-1]
Out[53]:
In [54]:
# Una submatriz
m[2:, 2:4]
Out[54]:
In [92]:
# Otra forma de dar la misma submatriz
m[-2:, -3:-1]
Out[92]:
Se puede indicar la lista de elementos a tomar de una fila o una columna
In [94]:
m[:,[1,3]]
Out[94]:
In [70]:
m
Out[70]:
In [76]:
# Convertir una matriz en un vector .flatten o .ravel
m.flatten()
Out[76]:
In [79]:
m.T.ravel()
Out[79]:
In [80]:
m.shape
Out[80]:
In [87]:
m.reshape((2,10))
Out[87]:
In [89]:
# NumPy puede inferir la dimensión faltante
m.reshape((2,-1))
Out[89]:
In [90]:
m.T.reshape((10,2))
Out[90]:
In [ ]: