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

Creando firmas de virus para ClamAV

ClamAv es un antivirus opensource y multiplataforma creado por Tomasz Kojm muy utilizado en los servidores de correo Linux. Este antivirus es desarrollado por la comunidad, y su utilidad práctica depende de que su base de datos de firmas sea lo suficientemente grande y actualizado. Para ello es necesario que voluntarios contribuyan activamente aportando firmas. El presente artículo pretende describir de manera sencilla cómo crear firmas de virus para ClamAV y contribuir con ellas a la comunidad.

Manejo de grafos con NetworkX en Python

El aprendizaje computacional es un área de investigación que en los últimos años ha tenido un auge importante, sobre todo gracias al aprendizaje profundo (Deep Learning). Pero no todo son redes neuronales. Paralelamente a estas técnicas, más bien basadas en el aprendizaje de patrones, también hay un auge de otras técnicas, digamos, más basadas en el aprendizaje simbólico. Si echamos la vista algunos años atrás, podemos considerar que quizá, la promesa de la web semántica como gran base de conocimiento ha fracasado, pero no es tan así. Ha ido transmutándose y evolucionando hacia bases de conocimiento basadas en ontologías a partir de las cuales es posible obtener nuevo conocimiento. Es lo que llamamos razonamiento automático y empresas como Google ya lo utilizan para ofrecerte información adicional sobre tus búsquedas. Ellos lo llaman Grafos de Conocimiento o Knowledge Graphs . Gracias a estos grafos de conocimiento, Google puede ofrecerte información adicional sobre tu búsqueda, ad

Scripts en NMAP

Cuando pensamos en NMAP, pensamos en el escaneo de puertos de un host objetivo al que estamos relizando una prueba de intrusión, pero gracias a las posibilidades que nos ofrecen su Scripting Engine , NMAP es mucho más que eso. Antes de continuar, un aviso: algunas de posibilidades que nos ofrecen los scripts de NMAP son bastante intrusivas, por lo que recomiendo hacerlas contra hosts propios, máquinas virtuales como las de Metasploitable, o contrato de pentesting mediante. Para este artículo voy a usar las máquinas de Metasploitable3 . No voy a entrar en los detalles sobre el uso básico de NMAP, ya que hay miles de tutoriales en Internet que hablan sobre ello. Lo cierto es que NMAP tiene algunas opciones que permiten obtener información extra, además de qué puertos están abiertos y cuales no. Por ejemplo, la opción -sV trata de obtener el servicio concreto, e incluso la versión del servicio que está corriendo en cada puerto. Otro ejemplo es la opción -O, que intenta averiguar el