Ir al contenido principal

Breve introducción a las matrices con NumPy


La librería NumPy traslada la potencia de entornos como Matlab u Octave al lenguaje de programación Python. Acometer un proyecto de Machine Learning o IA requiere un manejo intensivo y eficaz de cálculo matricial, y NumPy pone a nuestra disposición toda esa potencia. La libraría dispone de un montón de herramientas y capacidades que no es posible acometer en un artículo como este, sin embargo, me dispongo a contaros lo más importante en cuanto al manejo de matrices con NumPy.

Empecemos por un ejemplo sencillo: vamos a crear una matriz.
import numpy as np

matrix1 = np.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
print (matrix)
[[1 2 3 4]
 [5 6 7 8]]
La primera línea importa la librería para poder usarla en el programa y seguidamente se crea una matriz de dimensión 2x4. Alternativamente, podemos usar una sintaxis al estilo de Matlab.
matrix1 = np.matrix('1 2 3 4; 5 6 7 8')
Existen otras tres funciones que nos facilitan la creación de matrices: zeros() crea una matriz inicializada con el valor 0, ones() hace lo mismo pero con todos sus valores a 1. Finalmente, eye() crea la matriz identidad del tamaño que especifiquemos como parámetro.
zeros = np.zeros([2,3])
print (zeros)
[[ 0.  0.  0.]
 [ 0.  0.  0.]]

ones = np.ones([3, 2])
print (ones)
[[ 1.  1.]
 [ 1.  1.]
 [ 1.  1.]]

eye = np.eye(4)
print (eye)
[[ 1.  0.  0.  0.]
 [ 0.  1.  0.  0.]
 [ 0.  0.  1.  0.]
 [ 0.  0.  0.  1.]]
Podemos acceder a valores concretos de la matriz o a porciones completas. Vamos a verlo con algunos ejemplos:
matrix1 = np.matrix('1 2 3; 4 5 6; 7 8 9')
print (matrix1)
[[1 2 3]
 [4 5 6]
 [7 8 9]]

print (matrix1[0])
[[1 2 3]]
En este ejemplo, estamos accediendo a la primera fila (fila 0) de la matriz. Si queremos acceder a un sólo elemento podemos hacerlo así:
print (matrix1[0,1])
2
También podemos acceder a una porción de una fila:
print (matrix1[1, 1:3])
[[5 6]]
Y lo mismo es aplicable a las columnas:
print (matrix1[0:3, 0])
[[1]
 [4]
 [7]]
Las funciones size() y shape() nos devuelven el número de elementos y la dimensión de la matriz respectivamente.
print (matrix1.size)
9

print (matrix1.shape)
(3, 3)
Otra información útil que podemos obtener es el valor máximo, el mínimo y la media de los valores de la matriz:
print (matrix1.max())
9

print (matrix1.min())
1

print (matrix1.mean())
5.0
No sólo es posible acceder a los elementos de la matriz para consultarlos, también pueden ser modificados:
matrix1 = np.matrix('1 2; 3 4')
print (matrix1)
[[1 2]
 [3 4]]

matrix1[1, 0] = 10
print(matrix1)
[[ 1  2]
 [10  4]]

matrix1[0] = [6, 7]
print (matrix1)
[[ 6  7]
 [10  4]]
El primer ejemplo modifica un valor de la matriz y el segundo sustituye una fila entera. Como se puede observar, se sigue la misma notación que hemos usado para acceder a los valores de la matriz un poco más arriba. Otra función útil es flatten(), que convierte la matriz en un array de una dimensión con todos los elementos de la matriz.
print (matrix1.flatten())
[[ 6  7 10  4]]
Hasta ahora hemos visto como se crean las matrices, como se accede a ellas y como cambiamos sus valores. Abordamos ahora las operaciones matemáticas. Empezamos por una que se usa bastante, la matriz traspuesta.
print(matrix1.T) 
[[ 6 10]
 [ 7  4]]
Sobre las matrices se pueden aplicar las operaciones matemáticas básicas, tanto entre matrices como entre una matriz y un escalar. Los siguientes ejemplos ilustran la suma de una matriz y un escalar y la suma entre dos matrices.
matrix1 = np.matrix('1 2; 3 4')
matrix2 = np.matrix('5 6; 7 8')
print (matrix1 + 2)
[[3 4]
 [5 6]]

print (matrix1 + matrix2)
[[ 6  8]
 [10 12]]
Nos resta por ver la multiplicación de matrices, la más usada junto con la traspuesta.
matrix1 = np.matrix('1 2 3; 4 5 6; 7 8 9')
matrix2 = np.matrix('1 2; 3 4; 5 6')
print (matrix1 * matrix2)
[[ 22  28]
 [ 49  64]
 [ 76 100]]
NumPy tiene muchas más posibilidades, pero considero que esto es lo básico para empezar a trabajar con ella. En próximos artículos tendremos la oportunidad de hacer uso de ella en algún que otro ejemplo práctico.

Comentarios

Entradas populares de este blog

Criptografía en Python con PyCrypto

A la hora de cifrar información con Python, tenemos algunas opciones, pero una de las más fiables es la librería criptográfica PyCrypto, que soporta funciones para cifrado por bloques, cifrado por flujo y cálculo de hash. Además incorpora sus propios generadores de números aleatorios. Seguidamente os presento algunas de sus características y también como se usa.


Regresión lineal y descenso de gradiente con Python

En machine learning, el objetivo principal es encontrar un modelo que explique el comportamiento de un sistema (en el amplio sentido de la palabra). A partir de unos datos de entrenamiento, un sistema de aprendizaje automático ha de ser capaz de inferir un modelo capaz de explicar, al menos en su mayoría, los efectos observados. Pero también aplicar ese aprendizaje. Por ejemplo, un sistema de machine learning muy lucrativo para las empresas anunciantes es aquél que dado un perfil de usuario (datos de entrada A), sea capaz de predecir si pinchará o no (salida B) sobre un anuncio publicitario de, por ejemplo, comida para gatos. No es sencillo crear un modelo capaz de predecir el comportamiento del usuario (o sí), pero en todo caso, existen diferentes técnicas que nos permiten abordar el problema. En el caso del ejemplo que acabamos de ver, el modelo debería ser capaz de clasificar a los usuarios en dos clases diferentes, los que pulsarán y los que no pulsarán el anuncio de comida de ga…

Desbordamiento de enteros (Integer Overflow)

Ya os he hablado en este blog de posibles problemas potenciales que se pueden dar en los programas y que son susceptibles de ser explotados para hacer que dichos programas se comporten de forma diferente a la que deberían. Uno de estos problemas es el del desbordamiento de la pila. Sin embargo, hay otros posibles errores de programación que, aunque menos obvios, son igual de peligrosos. Uno de ellos es el desbordamiento de enteros o integer overflow. Para entender cómo funciona os presento un ejemplo muy sencillo pero didáctico.