Creando una animación con matplotlib y ffmpeg

En esta nueva entrada vamos a ver una revisión rápida al módulo animation en matplotlib, disponible desde la versión 1.1 de matplotlib.

[Para esta entrada se ha usado matplotlib 1.1.1, numpy 1.6.1, ipython 0.13 sobre python 2.7.3 y ffmpeg como librería externa que usará matplotlib para crear el video de la animación (aunque también puede usar mencoder)] todo ello corriendo en linux. Puede que los usuarios de windows tengan problemas al guardar el video si ffmpeg no está instalado y/o correctamente configurado para que matplotlib pueda trabajar con ffmpeg.

Hay varias formas de hacer una animación usando FuncAnimation, ArtistAnimation y/o TimedAnimation. Las dos primeras formas son clases que heredan de la tercera mientras que la tercera hereda de la clase base Animation.

Para este ejemplo de como hacer una animación con matplotlib y ffmpeg vamos a usar FuncAnimation y vamos a representar la evolución de un atractor de Lorenz en 3D.

Continue reading

Juego de la vida de Conway con Python usando NumPy

Introducción

En esta breve entrada vamos a ver cómo implementar el juego de la vida de Conway en Python utilizando arrays de NumPy. El juego de la vida es posiblemente el ejemplo más famoso de autómata celular, es decir, un sistema dinámico que evoluciona en pasos discretos. Actualmente están siendo estudiados en profundidad por Stephen Wolfram (creador además del software Mathematica) y tienen aplicaciones en campos tan diversos como la biología o la economía.

Aunque existe una implementación muy inteligente en Rosetta Code utilizando objetos defaultdict, voy a escribir la mía propia porque me parece «visualmente» más intuitiva. Para eso me voy a basar en el algoritmo seguido por Michael Gertelman[I] para escribir el programa en una línea usando APL (!) y en una entrada de Peter Collingridge[II], basada a su vez en la primera, donde aplica la misma idea en Python. Ambos están en las referencias al final de este texto.

¡Vamos allá!

Nota: Jake VanderPlas ofrece una versión todavía más corta del juego de la vida. Básicamente es la misma idea pero resumida en una línea 🙂 La otra versión emplea la función `scipy.signal.convolve2d`.

El juego de la vida de Conway

Aunque hay muchas variantes del juego de la vida, nosotros nos vamos a centrar en la que publicó originalmente Conway en 1970. El juego de la vida es un juego de cero jugadores, lo que quiere decir que su evolución está determinada por el estado inicial y no necesita ninguna entrada de datos posterior (Wikipedia). Las reglas son las siguientes:

  • El tablero es una rejilla de celdas cuadradas que tienen dos posibles estados: viva y muerta.
  • Cada célula tiene ocho células vecinas: se cuentan también las de las diagonales.
  • En cada paso, todas las células se actualizan instantáneamente teniendo en cuenta la siguiente regla:
    • Cada célula viva con 2 o 3 células vecinas vivas sobrevive.
    • Cada célula con 4 o más células vecinas vivas muere por superpoblación. Cada célula con 1 o ninguna célula vecina viva muere por soledad.
    • Cada célula muerta con 3 células vecinas vivas nace.

¡Vamos con la implementación!

Continue reading