El producto de matrices y el nuevo operador @

Introducción.

El 13 de septiembre de 2015 fue lanzada la versión 3.5 de Python. Entre las novedades podemos encontrar la inclusión del PEP 465 que trata sobre el nuevo operador @ para la multipliación matricial y del que hablaremos en este post. Como bien sabrán los lectores de este blog, los arrays son la piedra angular de numerosísimas áreas de la programación científica y sirven para realizar operaciones de forma masiva y mucho más eficiente. Esto, sumado a la posibilidad de utilizarlos como matrices, proporciona una herramienta muy potente para llevar a cabo operaciones algebraicas. NumPy es la librería que nos permite utilizar esta maravillosa estructura de datos y según figura en el ya citado PEP, podría ser la librería fuera de la librería estándar más importada del mundo Python.

Continue reading

¿Cómo trabajar con arrays de binarios en Python?

Esta semana vamos con una pregunta de Gonzalo, que nos dice por email:

Saludos. Últimamente he estado trabajado en python y me gusta mucho. En estos momentos estoy haciendo un algoritmo genético con codificación en numeros binarios utilizando bitset de C++. ¿Tendran información acerca de como trabajar con cadenas de binarios en python? Gracias y Felicidades por el blog.

He investigado un poco acerca de bitset en la referencia de C++, y leo que se trata básicamente de un array de valores booleanos, optimizados para su almacenamiento en memoria.

Continue reading

¿Por qué usar netCDF?

Primero de todo empezaremos por el principio

¿Qué es netCDF?

Es un conjunto de librerías (o bibliotecas) y un formato de datos que son:

  • auto-descriptivo ya que incluye información acerca de los datos contenidos en el fichero netCDF
  • independiente de la plataforma
  • podemos acceder a un subconjunto de datos del fichero de forma eficiente
  • permite agregar datos a un fichero ya existente sin necesidad de copiar los datos ya existentes en el fichero
  • puede ser fácilmente compartido ya que una persona puede escribir mientras varias personas pueden leer el mismo fichero.
  • puede ser archivado ya que las versiones previas siempre estarán soportadas por las nuevas versiones

Su actual versión es la 4 y permite leer los ficheros creados con versiones anteriores de netCDF, como se ha comentado anteriormente.

Además es compatible con un subconjunto de HDF5 (del que hablaremos otro día, Francesc, ¿te animas como firma invitada?) pudiendo leer gran cantidad de ficheros en formato HDF5 pero no todos. HDF5 es capaz de abrir cualquier fichero creado con netCDF-4 (que es el modelo mejorado de datos que veremos a continuación). Es decir, un fichero netCDF-4 es un fichero HDF5 pero no a la inversa.

Es además un estándar para varias instituciones como la Open Geospatial Consortium.

¿Cuál es el formato de un fichero netCDF?

El formato no es único, existe un modelo clásico, más sencillo, y el modelo mejorado (llamado netCDF4), más complejo y completo.

Continue reading

Funciones definidas a trozos con arrays de NumPy

Introducción

Hoy vamos a ver cómo crear funciones definidas a trozos que manejen arrays de NumPy. Seguro que todos conocéis este tipo de funciones, pero a la hora de crearlas en NumPy me encontré con un par de obstáculos en el camino que me gustaría compartir con vosotros.

Como ya sabéis, las funciones definidas a trozos son ubicuas en matemáticas y se utilizan cuando queremos ensamblar varias funciones en una sola. Vamos a ver cómo construirlas en Python utilizando la función numpy.piecewise y vamos a revisar un par de conceptos sobre comparación de arrays e indexación avanzada utilizando valores booleanos. Esto último suena un poco a magia negra pero ya veréis cómo no es para tanto :P

En esta entrada se ha usado python 2.7.3 y numpy 1.6.2.

Funciones definidas a trozos

La función de NumPy numpy.piecewise acepta, como mínimo, tres argumentos:

  • un array de valores en los que evaluar la función x,
  • una lista de arrays booleanos condlist que son los «trozos» en los que se divide la función, que deben tener la misma forma que x,
  • y una lista de funciones funclist que se corresponden con cada uno de los trozos.

Continue reading

Cómo crear matrices en Python con NumPy

Introducción

En este breve apunte vamos a ver cómo crear matrices en Python usando la biblioteca NumPy. Para ello, vamos a hacer un repaso rápido de los métodos que ofrece NumPy para crear arrays y matrices.

Si buscas por Internet encontrarás varias recetas de cómo crear una matriz en Python utilizando listas, es decir, haciendo uso solamente de la biblioteca estándar. Sin embargo, aquí asumimos que vamos a emplear la matriz básicamente para hacer cálculos matemáticos con ella, y por otro lado en nuestro caso no supone un problema añadir NumPy como dependencia porque por unas razones o por otras lo íbamos a necesitar ;)

Esta entrada es básicamente una recopilación de los métodos listados en la documentación de NumPy. Otro día veremosEn este artículo en nuestro blog puedes leer cómo construir arrays a partir de ficheros externos.

Editado el 13 de junio de 2012: Añadidas funciones para crear arrays de NumPy a partir de listas y una nota sobre el peligro de la función empty.

En esta entrada se ha usado python 2.7.3 y numpy 1.6.1 y es compatible con python 3.2.3

Arrays vacíos, unos y ceros

Con estas funciones podemos crear una matriz en Python cuando conocemos el tamaño pero no conocemos los datos que va a contener, o cuando por cualquier motivo queremos matrices llenas de unos o de ceros. Para ello utilizaremos las funciones empty, zeros y ones, que aceptan como argumento una tupla con las dimensiones del array:

In [1]: import numpy as np
In [2]: np.empty((2, 3))  # Matriz vacía, con valores residuales de la memoria
Out[2]:
array([[  0.00000000e+000,   1.19528827e-316,   6.94132801e-310],
       [  1.41077362e-316,   6.94132772e-310,   6.94132772e-310]])
In [3]: np.zeros((3, 1))  # Matriz de ceros
Out[3]:
array([[ 0.],
       [ 0.],
       [ 0.]])
In [4]: np.ones((3, 2))  # Matriz de unos
Out[4]:
array([[ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])

Continue reading

Álgebra Lineal en Python con NumPy (I): Operaciones básicas

Introducción

En esta entrada vamos a ver una introducción al Álgebra Lineal en Python con NumPy. En la mayoría de los artículos que hemos escrito hasta ahora en Pybonacci hemos tocado sin mencionarlos conceptos relativos al Álgebra Lineal: sin ir más lejos, el propio manejo de matrices o la norma de vectores. El lenguaje matricial es el punto de partida para una enorme variedad de desarrollos físicos y matemáticos, y por eso le vamos a dedicar un apartado especial para repasar las posibilidades que ofrece el paquete NumPy.

  1. Operaciones básicas
  2. Sistemas, autovalores y descomposiciones

En esta entrada se ha usado python 2.7.3 y numpy 1.6.1 y es compatible con python 3.2.3

Arrays y matrices

Como ya comentamos hace tiempo en nuestra introducción a Python, el paquete NumPy introdujo los arrays N-dimensionales, que no son más que colecciones homogéneas de elementos indexados usando N elementos. Los hemos utilizado constantemente usando las funciones de creación de arrays:

In [1]: import numpy as np
In [2]: np.array([1, 2, 3])  # Array de una lista
Out[2]: array([1, 2, 3])
In [3]: np.arange(5)  # Array de 5 enteros contando el 0
Out[3]: array([0, 1, 2, 3, 4])
In [4]: np.zeros((2, 3))  # Array de ceros de 2x3
Out[4]:
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
In [5]: np.linspace(0.0, 1.0, 5)  # Discretización de [0, 1] con 5 puntos
Out[5]: array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ])

Además de los arrays, con NumPy también podemos manejar matrices. Aunque parecen lo mismo, se utilizan de manera distinta; si alguien quiere investigar las diferencias, puede consultar la página NumPy para usuarios de MATLAB (en inglés).

Continue reading