Paquete Numpy
Contents
Paquete Numpy#
Important
Para tener presente
Numpy es la librería central para la computación científica en Python.
En cuadernos anteriores ya hemos trabajado con algunos paquetes, por ejemplo math
. Cuando se importan los paquetes y no se les asigna ningún alias, para usar una función de dicho paquete debe digitarse el nombre del paquete seguido de un punto y el nombre de la función, constante, etc., como por sigue:
import math
math.pi
3.141592653589793
Cuando se le pone un alias al paquete, se debe digitar el alias, seguido del punto y luego la función o constante:
import math as loquequiera
loquequiera.pi
3.141592653589793
Para conocer la ayuda que tienen las funciones o constantes, podemos emplear el siguiente código:
?math.pi
Si queremos conocer todos los atributos o métodos que tiene el paquete, empleamos la función dir
:
dir(math)
['__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'acos',
'acosh',
'asin',
'asinh',
'atan',
'atan2',
'atanh',
'ceil',
'comb',
'copysign',
'cos',
'cosh',
'degrees',
'dist',
'e',
'erf',
'erfc',
'exp',
'expm1',
'fabs',
'factorial',
'floor',
'fmod',
'frexp',
'fsum',
'gamma',
'gcd',
'hypot',
'inf',
'isclose',
'isfinite',
'isinf',
'isnan',
'isqrt',
'lcm',
'ldexp',
'lgamma',
'log',
'log10',
'log1p',
'log2',
'modf',
'nan',
'nextafter',
'perm',
'pi',
'pow',
'prod',
'radians',
'remainder',
'sin',
'sinh',
'sqrt',
'tan',
'tanh',
'tau',
'trunc',
'ulp']
Ahora que ya recordamos como invocar paquetes, importaremos el paquete numpy
con su alias np
:
import numpy as np
Si queremos conocer la ayuda del paquete y el contenido del mismo, recuerda utilizar los siguientes comandos:
?np
dir(np)
Conceptos básicos#
El objeto más importante de numpy es el arreglo (array
) multidimensional homogéneo, es decir, una tabla de elementos del mismo tipo, indexados por una tupla de enteros no negativos. En numpy las dimensiones del arreglo las llamaremos ejes (axes).
Ejemplo#
Un elemento en \(\mathbb{R}^n\) es un arreglo \(n\)-dimensional con un único eje:
V = np.array([2,1,4])
print(V)
[2 1 4]
W = np.array([3,1,2])
W
array([3, 1, 2])
Con los arreglos de numpy
podemos hacer operaciones, como por ejemplo sumarlos y restarlos elemento a elemento:
print(V+W)
[5 2 6]
print(V-W)
[-1 0 2]
El contenido de los arreglos no necesariamente, debe ser numérico, pueden ser cadenas de texto o variables booleanas, etc.
np.array(['a',1])
array(['a', '1'], dtype='<U21')
BV=np.array([True,False,True])
print(BV)
[ True False True]
Cuando vimos listas multidimensionales, definimos lo que es una matriz. En este paquete tenemos un concepto análogo de lo que es una matriz de tamaño \(n\times m\), es un arreglo de dos ejes:
M=np.array([[1,0,1],[0,1,0],[2,1,3]])
print(M)
[[1 0 1]
[0 1 0]
[2 1 3]]
Sobre este tipo de arreglos tenemos algunos métodos muy interesantes, como lo son: dtype
, shape
, cumsum()
y ndim
:
M.dtype
#Para conocer el tipo de dato con el que estamos trabajando
dtype('int64')
M.shape
#Para conocer las dimensiones del arreglo
(3, 3)
CS=M.cumsum()
CS
#Crea un arreglo, en el que la entrada i es la suma de todos los elementos hasta él en el arreglo
array([1, 1, 2, 2, 3, 3, 5, 6, 9])
En casos más generales, podríamos trabajar con un arreglo de matrices, o mejor conocido como tensor:
T=np.array([[[[1,2,1,4],[3,2,4,1],[4,2,3,1]],[[1,2,3,1],[0,1,2,3],[1,4,5,6]]],[[[2,3,4,1],[1,1,2,1],[0,1,1,2]],[[1,2,3,1],[0,1,1,1],[2,1,3,1]]]])
print(T)
[[[[1 2 1 4]
[3 2 4 1]
[4 2 3 1]]
[[1 2 3 1]
[0 1 2 3]
[1 4 5 6]]]
[[[2 3 4 1]
[1 1 2 1]
[0 1 1 2]]
[[1 2 3 1]
[0 1 1 1]
[2 1 3 1]]]]
T.shape
(2, 2, 3, 4)
T.dtype
dtype('int64')
T.ndim
4
La exploración de elementos que conforman al arreglo es similar a la de las listas de Python, con la salvedad de que en la matriz, o el tensor no tenemos una lista de listas, motivo por el cual podemos llamar a los elementos de una manera adicional:
V
array([2, 1, 4])
V[1]
1
print(M)
[[1 0 1]
[0 1 0]
[2 1 3]]
M[1,1]
1
#El comando anterior equivale a:
M[1][1]
1
print(T)
[[[[1 2 1 4]
[3 2 4 1]
[4 2 3 1]]
[[1 2 3 1]
[0 1 2 3]
[1 4 5 6]]]
[[[2 3 4 1]
[1 1 2 1]
[0 1 1 2]]
[[1 2 3 1]
[0 1 1 1]
[2 1 3 1]]]]
T[1]
array([[[2, 3, 4, 1],
[1, 1, 2, 1],
[0, 1, 1, 2]],
[[1, 2, 3, 1],
[0, 1, 1, 1],
[2, 1, 3, 1]]])
T[1,0]
#T[1][0]
array([[2, 3, 4, 1],
[1, 1, 2, 1],
[0, 1, 1, 2]])
T[1,0,2]
#T[1][0][2]
array([0, 1, 1, 2])
#Los tensores pueden contener texto:
TT=np.array([[[1,0,1],[0,1,0]],[[1,"0",3],[1,2,5]]])
TT
array([[['1', '0', '1'],
['0', '1', '0']],
[['1', '0', '3'],
['1', '2', '5']]], dtype='<U21')
TT.shape
(2, 2, 3)
TT[1,1,1]
#TT[1][1][1]
'2'
Para extraer submatrices, podemos usar también índices de sublistas:
M2 = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
print(M2)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
M2[:2,1:3]
#Tomamos los elementos de las filas 0 y 1
#que estén en las columnas 1 y 2
array([[2, 3],
[6, 7]])
T=np.array([[[1,2,3,4],[5,6,7,8],[9,10,11,12]],[[13,14,15,16],[17,18,19,20],[21,22,23,24]],[[25,26,27,28],[29,30,31,32],[33,34,35,36]]])
print(T)
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[13 14 15 16]
[17 18 19 20]
[21 22 23 24]]
[[25 26 27 28]
[29 30 31 32]
[33 34 35 36]]]
Ahora extraeremos de las dos primeras matrices, lo que esté desde la fila 1 en adelante y lo que esté en las columnas 1 y 2.
T[:2,1:,1:3]
array([[[ 6, 7],
[10, 11]],
[[18, 19],
[22, 23]]])
También podemos extraer elementos utilizando listas así:
nombre_del_arreglo[[índices_de_filas],[índices_de_columnas]]
#Recordemos:
print(M2)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
M2[[0,2],[1,3]]
array([ 2, 12])
Ahora extraeremos los valores 1,6,11 y 8 de la matriz M2:
M2[[0,1,2,1],[0,1,2,3]]
array([ 1, 6, 11, 8])
Los elementos se pueden repetir, por ejemplo:
M2[:,[0,1,2,2,1,1,2,2]]
array([[ 1, 2, 3, 3, 2, 2, 3, 3],
[ 5, 6, 7, 7, 6, 6, 7, 7],
[ 9, 10, 11, 11, 10, 10, 11, 11]])
Si deseamos extraer filas:
M2[np.array([0,2])]
array([[ 1, 2, 3, 4],
[ 9, 10, 11, 12]])
Si lo que queremos extraer son columnas:
M2[:,np.array([2,0])]
array([[ 3, 1],
[ 7, 5],
[11, 9]])
Recordemos algunos de los comandos vistos de numpy
:
.ndim
(número de ejes del arreglo)
V.ndim
1
M.ndim
2
T.ndim
3
.shape
(La dimensión del arreglo. Obtenemos una tupla de enteros)
V.shape
(3,)
M.shape
(3, 3)
T.shape
(3, 3, 4)
.size
(El número total de elementos que conforman al arreglo)
V.size
3
T.size
36
M.size
9
print(M)
[[1 0 1]
[0 1 0]
[2 1 3]]
.concatenate
(concatena dos matrices, bien sea por filas o columnas)
np.concatenate((M,M),axis=0)
#Concatena por filas
array([[1, 0, 1],
[0, 1, 0],
[2, 1, 3],
[1, 0, 1],
[0, 1, 0],
[2, 1, 3]])
np.concatenate((M,M),axis=1)
#Concatena por columnas
array([[1, 0, 1, 1, 0, 1],
[0, 1, 0, 0, 1, 0],
[2, 1, 3, 2, 1, 3]])
N=np.concatenate((M,np.array([[0],[0],[0]])),axis=1)
N
array([[1, 0, 1, 0],
[0, 1, 0, 0],
[2, 1, 3, 0]])
Podemos intercambiar filas o columnas, seleccionando el orden que deseamos en la sublista:
N[:,[0,1,3,2]]
array([[1, 0, 0, 1],
[0, 1, 0, 0],
[2, 1, 0, 3]])
.dtype
(el tipo de lementos en el arreglo)
M.dtype
dtype('int64')
A=np.array([3<2,2<3,4<5])
print(A)
[False True True]
A.dtype
dtype('bool')
TT2=np.array([A,V])
print(TT2)
[[0 1 1]
[2 1 4]]
TT2.dtype
dtype('int64')
Creación de algunos arreglos clásicos#
Tenemos la oportunidad de utilizar algunas funciones de Numpy para generar arreglos y matrices ampliamente utilizadas:
ceros=np.zeros((2,3))
print(ceros)
[[0. 0. 0.]
[0. 0. 0.]]
unos=np.ones((2,2,3))
print(unos)
[[[1. 1. 1.]
[1. 1. 1.]]
[[1. 1. 1.]
[1. 1. 1.]]]
constante=np.full((4,3),5)
print(constante)
[[5 5 5]
[5 5 5]
[5 5 5]
[5 5 5]]
constante2=np.full((4,3),5<2) #Creamos una matriz de 4x3 llena de False
constante2[1,1]=True #Asignamos el valor True a la entrada
print(constante2)
[[False False False]
[False True False]
[False False False]
[False False False]]
constante3=np.full((4,3),"Hola")
print(constante3)
[['Hola' 'Hola' 'Hola']
['Hola' 'Hola' 'Hola']
['Hola' 'Hola' 'Hola']
['Hola' 'Hola' 'Hola']]
identidad=np.eye(6,5)
print(identidad)
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 0. 0.]]
Unas matrices muy particulares son las que tienen su contenido generado de manera aleatoria:
aleatoria = np.random.random((2,2))
print(aleatoria)
[[0.63918363 0.68034376]
[0.7387291 0.11227126]]
?np.random
Operaciones entre matrices#
Las matrices son un objeto que se abordará profundamente en el curso de Álgebra Lineal, pero te presentaremos algunas de sus operaciones ya que siguen las ideas que hemos visto en las listas y en los arreglos:
import numpy as np
x = np.array([[1,2,3],[4,5,6]], dtype=np.float64)
y = np.array([[7,8,9],[9,8,7]])
z=np.array([[1,1],[2,1]])
print(x)
print(y)
print(z)
[[1. 2. 3.]
[4. 5. 6.]]
[[7 8 9]
[9 8 7]]
[[1 1]
[2 1]]
La suma entre matrices, se realiza de la misma forma en que se hace con las listas, elemento a elemento:
print(x + y)
[[ 8. 10. 12.]
[13. 13. 13.]]
Del mismo modo ocurre con la resta:
print(x - y)
[[-6. -6. -6.]
[-5. -3. -1.]]
Algunas operaciones no tan comunes son las siguientes:
print(x*y) #multiplicación elemento a elemento
[[ 7. 16. 27.]
[36. 40. 42.]]
print(x / y) #división elemento a elemento
[[0.14285714 0.25 0.33333333]
[0.44444444 0.625 0.85714286]]
print(y)
print(np.sqrt(y)) #raíz cuadrada elemento a elemento
[[7 8 9]
[9 8 7]]
[[2.64575131 2.82842712 3. ]
[3. 2.82842712 2.64575131]]
print(np.transpose(y)) #transpuesta (las filas se vuelven columnas)
[[7 9]
[8 8]
[9 7]]
print(y.T) #transpuesta
[[7 9]
[8 8]
[9 7]]
(m,k) @ (k,n)=(m,n)
print(x@np.transpose(y)) #multiplicación de matrices
[[ 50. 46.]
[122. 118.]]
print(np.transpose(y)@x)
[[43. 59. 75.]
[40. 56. 72.]
[37. 53. 69.]]
print(x.dot(y.T)) #multiplicación de matrices
[[ 50. 46.]
[122. 118.]]
print(x)
[[1. 2. 3.]
[4. 5. 6.]]
print(np.sum(x)) #suma de todos los elementos
print(np.sum(x, axis=0)) #suma de elementos por columnas
print(np.sum(x, axis=1)) #suma de elementos por filas
21.0
[5. 7. 9.]
[ 6. 15.]
Mas funciones aquí
Operaciones especiales#
En ocasiones tenemos que hacer algunas operaciones que no tienen en cuenta la forma de las matrices o que involucran matrices de diferentes tamaños. Aquí algunos ejemplos:
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
print(x)
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
Para sumar la misma constante a cada elemento del arreglo:
print(x+10)
[[11 12 13]
[14 15 16]
[17 18 19]
[20 21 22]]
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
print(x)
v = np.array(np.transpose([[1, 0, 1,1]]))
print(v)
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[1]
[0]
[1]
[1]]
x+v
array([[ 2, 3, 4],
[ 4, 5, 6],
[ 8, 9, 10],
[11, 12, 13]])
x+1
array([[ 2, 3, 4],
[ 5, 6, 7],
[ 8, 9, 10],
[11, 12, 13]])
Suma de un vector a una fila
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
print(x)
v = np.array([1, 0, 1])
print(v)
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[1 0 1]
x[0]=x[0]+v
print(x)
[[ 2 2 4]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
Multiplicar una fila por un número real (escalar)
x[0]=x[0]*2
print(x)
[[ 4 4 8]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
Intercambiar filas (empleando una variable auxiliar)
fc=x.copy()
x[1]=x[0]
x[0]=fc[1]
print(x)
[[ 4 5 6]
[ 4 4 8]
[ 7 8 9]
[10 11 12]]
Operaciones entre matrices de diferente tamaño (Broadcasting)#
NumPy transforma los arreglos involucrados para que tengan el mismo tamaño y, por tanto, puedan someterse a las operaciones por elementos sin generar excepciones.
a = np.arange(0.2, 40.2, 10.5)
a.shape
(4,)
print(a)
[ 0.2 10.7 21.2 31.7]
a = a[:, np.newaxis] #Adicionamos un eje
print(a.shape)
a
(4, 1)
array([[ 0.2],
[10.7],
[21.2],
[31.7]])
b = np.array([0, 1, 2])
print(b)
[0 1 2]
Ahora, sumaremos a cada columna de la matriz a el arreglo b definido en la línea anterior:
a+b
array([[ 0.2, 1.2, 2.2],
[10.7, 11.7, 12.7],
[21.2, 22.2, 23.2],
[31.7, 32.7, 33.7]])
Las siguientes matrices sirven como otro ejemplo para este tipo de operaciones:
A=np.array([[0,1],[1,2]])
B=np.array([[2,1],[1,2]])
A.shape
(2, 2)
A= A[:,:, np.newaxis]
A.shape
(2, 2, 1)
A
array([[[0],
[1]],
[[1],
[2]]])
A+B
array([[[2, 1],
[2, 3]],
[[3, 2],
[3, 4]]])
Nota que a la matriz B se le ha sumado en cada columna, la columna [0,1] y luego [1,2].
Herramientas interactivas ipywidgets
#
Otro paquete que será transversal en este curso y nos permitira crear interfaces interesantes para nuestros estudiantes es ipywidgets. Para instalar desde el cuaderno escriba:
!pip install ipywidgets
Requirement already satisfied: ipywidgets in /home/izainea/miniconda3/lib/python3.9/site-packages (7.7.1)
Requirement already satisfied: ipython>=4.0.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipywidgets) (8.4.0)
Requirement already satisfied: traitlets>=4.3.1 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipywidgets) (5.3.0)
Requirement already satisfied: ipykernel>=4.5.1 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipywidgets) (6.15.1)
Requirement already satisfied: ipython-genutils~=0.2.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipywidgets) (0.2.0)
Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipywidgets) (1.1.1)
Requirement already satisfied: widgetsnbextension~=3.6.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipywidgets) (3.6.1)
Requirement already satisfied: jupyter-client>=6.1.12 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.3.4)
Requirement already satisfied: psutil in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets) (5.9.1)
Requirement already satisfied: packaging in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets) (21.3)
Requirement already satisfied: matplotlib-inline>=0.1 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)
Requirement already satisfied: tornado>=6.1 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.2)
Requirement already satisfied: nest-asyncio in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.5)
Requirement already satisfied: pyzmq>=17 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets) (23.2.0)
Requirement already satisfied: debugpy>=1.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.6.2)
Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.30)
Requirement already satisfied: stack-data in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipython>=4.0.0->ipywidgets) (0.3.0)
Requirement already satisfied: pickleshare in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)
Requirement already satisfied: jedi>=0.16 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)
Requirement already satisfied: backcall in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)
Requirement already satisfied: pexpect>4.3 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)
Requirement already satisfied: setuptools>=18.5 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipython>=4.0.0->ipywidgets) (61.2.0)
Requirement already satisfied: decorator in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)
Requirement already satisfied: pygments>=2.4.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from ipython>=4.0.0->ipywidgets) (2.12.0)
Requirement already satisfied: parso<0.9.0,>=0.8.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)
Requirement already satisfied: entrypoints in /home/izainea/miniconda3/lib/python3.9/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (0.4)
Requirement already satisfied: jupyter-core>=4.9.2 in /home/izainea/miniconda3/lib/python3.9/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (4.11.1)
Requirement already satisfied: python-dateutil>=2.8.2 in /home/izainea/miniconda3/lib/python3.9/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (2.8.2)
Requirement already satisfied: ptyprocess>=0.5 in /home/izainea/miniconda3/lib/python3.9/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)
Requirement already satisfied: wcwidth in /home/izainea/miniconda3/lib/python3.9/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)
Requirement already satisfied: six>=1.5 in /home/izainea/miniconda3/lib/python3.9/site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (1.16.0)
Requirement already satisfied: notebook>=4.4.1 in /home/izainea/miniconda3/lib/python3.9/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.12)
Requirement already satisfied: prometheus-client in /home/izainea/miniconda3/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.14.1)
Requirement already satisfied: argon2-cffi in /home/izainea/miniconda3/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)
Requirement already satisfied: jinja2 in /home/izainea/miniconda3/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.1.2)
Requirement already satisfied: nbformat in /home/izainea/miniconda3/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (5.4.0)
Requirement already satisfied: nbconvert>=5 in /home/izainea/miniconda3/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.5.0)
Requirement already satisfied: terminado>=0.8.3 in /home/izainea/miniconda3/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.15.0)
Requirement already satisfied: Send2Trash>=1.8.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)
Requirement already satisfied: nbclient>=0.5.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.13)
Requirement already satisfied: pandocfilters>=1.4.1 in /home/izainea/miniconda3/lib/python3.9/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)
Requirement already satisfied: tinycss2 in /home/izainea/miniconda3/lib/python3.9/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.1.1)
Requirement already satisfied: jupyterlab-pygments in /home/izainea/miniconda3/lib/python3.9/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.2.2)
Requirement already satisfied: MarkupSafe>=2.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.1.1)
Requirement already satisfied: defusedxml in /home/izainea/miniconda3/lib/python3.9/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)
Requirement already satisfied: mistune<2,>=0.8.1 in /home/izainea/miniconda3/lib/python3.9/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)
Requirement already satisfied: beautifulsoup4 in /home/izainea/miniconda3/lib/python3.9/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.11.1)
Requirement already satisfied: bleach in /home/izainea/miniconda3/lib/python3.9/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (5.0.1)
Requirement already satisfied: fastjsonschema in /home/izainea/miniconda3/lib/python3.9/site-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.15.3)
Requirement already satisfied: jsonschema>=2.6 in /home/izainea/miniconda3/lib/python3.9/site-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.2.0)
Requirement already satisfied: attrs>=17.4.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.4.0)
Requirement already satisfied: pyrsistent>=0.14.0 in /home/izainea/miniconda3/lib/python3.9/site-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.18.1)
Requirement already satisfied: argon2-cffi-bindings in /home/izainea/miniconda3/lib/python3.9/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)
Requirement already satisfied: cffi>=1.0.1 in /home/izainea/miniconda3/lib/python3.9/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)
Requirement already satisfied: pycparser in /home/izainea/miniconda3/lib/python3.9/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)
Requirement already satisfied: soupsieve>1.2 in /home/izainea/miniconda3/lib/python3.9/site-packages (from beautifulsoup4->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.3.2.post1)
Requirement already satisfied: webencodings in /home/izainea/miniconda3/lib/python3.9/site-packages (from bleach->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)
Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /home/izainea/miniconda3/lib/python3.9/site-packages (from packaging->ipykernel>=4.5.1->ipywidgets) (3.0.9)
Requirement already satisfied: executing in /home/izainea/miniconda3/lib/python3.9/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.3)
Requirement already satisfied: asttokens in /home/izainea/miniconda3/lib/python3.9/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)
Requirement already satisfied: pure-eval in /home/izainea/miniconda3/lib/python3.9/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)
#Debemos habilitar la extensión en nuestro entorno:
!jupyter nbextension enable --py widgetsnbextension
Enabling notebook extension jupyter-js-widgets/extension...
- Validating: OK
Importemos el paquete
from ipywidgets import interact
import ipywidgets as widgets
La herramienta más básica de este paquete es la función interact
. En el siguiente ejemplo veremos su utilidad:
def f(x):
print("El valor que escogió es", x)
return x
f(4)
El valor que escogió es 4
4
interact(f, x=1.2)
<function __main__.f(x)>
interact(f, x=True)
<function __main__.f(x)>
interact(f, x={0:'Elemento 1',1:'Elemento 2'})
<function __main__.f(x)>
interact(f, x='Soy interactivo')
<function __main__.f(x)>
Notemos que cada vez que se cambia el argumento de la función, el elemento interactivo cambia de inmediato, sin necesidad que nosotros lo indiquemos.
Veamos otro par de ejemplos:
def g(x):
y=x+5
print(x,"+",5,"=",y)
return y
g(8)
8 + 5 = 13
13
interact(g, x=1.2)
#Objeto interactivo: Slider tipo float
<function __main__.g(x)>
interact(g, x=1)
#Objeto interactivo: Slider tipo int
<function __main__.g(x)>
def nombrelargoocorto(t):
if len(t)>=7:
print(t+" es un nombre muy largo")
z="largo"
else:
print(t+" es un nombre corto")
z="corto"
return z
nombrelargoocorto("Benjamin")
Benjamin es un nombre muy largo
'largo'
interact(nombrelargoocorto, t="Pepito")
#Objeto interactivo: Caja de texto
<function __main__.nombrelargoocorto(t)>
interact(nombrelargoocorto, t=["Pepito","Luis","Gustavo","Felipe"])
#Objeto interactivo: Menú desplegable
<function __main__.nombrelargoocorto(t)>
Los elementos que permiten la interacción con el usuario son los widgets, una lista completa de ellos se encuentra aquí.
A continuación hacemos un cambio sobre el widget:
interact(f, x=widgets.IntText(
value=7,
description='Escriba un número: ',
disabled=False
));
interact()
<ipywidgets.widgets.interaction._InteractFactory at 0x7fb2fcb3ab80>
Una primera aplicación#
Ya que conocemos algo de Numpy y ipywidgets vamos a crear un ejemplo muy sencillo para calcular algunos estadísticos elementales de una lista de valores:
def estadisticos(x):
L=x.split()
L=[float(i) for i in L]
x=np.array(list(L))
print("La media es", np.mean(x))
print("La mediana es", np.median(x))
print("La varianza poblacional es", np.var(x))
print("La varianza muestral es", np.var(x,ddof=1))
print("La desviación estándar poblacional es", np.std(x))
print("La desviación estándar muestral es", np.std(x,ddof=1))
return
estadisticos("1 2 3")
La media es 2.0
La mediana es 2.0
La varianza poblacional es 0.6666666666666666
La varianza muestral es 1.0
La desviación estándar poblacional es 0.816496580927726
La desviación estándar muestral es 1.0
Evalue los estadísticos del conjunto de datos [1,1,2,3] y compruebelo con la herramienta:
estadisticos("1 2 3 4 5 7 8 3 1 3 4 1 3 4 8 0 9")
La media es 3.8823529411764706
La mediana es 3.0
La varianza poblacional es 6.927335640138407
La varianza muestral es 7.360294117647058
La desviación estándar poblacional es 2.6319832142584816
La desviación estándar muestral es 2.7129861993100994
interact(estadisticos,x="1 2 3")
<function __main__.estadisticos(x)>
def estadisticos(x):
try:
L=x.split()
L=[float(i) for i in L]
x=np.array(list(L))
print("La media es", np.mean(x))
print("La mediana es", np.median(x))
print("La varianza poblacional es", np.var(x))
print("La varianza muestral es", np.var(x,ddof=1))
print("La desviación estándar poblacional es", np.std(x))
print("La desviación estándar muestral es", np.std(x,ddof=1))
except:
print("Cuidado con lo que escribe, solo se admiten valores numéricos")
return
interact(estadisticos,x="1 2 3")
<function __main__.estadisticos(x)>
Ejercicio#
Crea una función, para luego hacer un elemento interactivo con ella, de tal modo que se digite una cantidad que sea el cuadrado de un número entero de datos y esta lo escriba como una matriz del tamaño adecuado, es decir, si se digitan 4 elementos, la respuesta de la función debe ser una matriz de tamaño 2x2.