Monday, September 13, 2010

¿Escribir datos? ¡Writecol lo hace por ti!

Tal como se lee, ¿tienes un montón de datos en vectores que quieres escribir de manera rápida con Python? Es hiper simple con este código que encontré: [~~Link~~] (si no sabes como agregar códigos nuevos a Python, revisa el siguiente post: http://astropytheando.blogspot.com/2010/09/leer-datos-en-python-como-usar-readcol.html).

Un ejemplo del uso de este simple código, en donde guardamos los dos arrays "a" y "b", le ponemos "nombres" a las columnas y llamamos al archivo "Archivo.dat":

from numpy import *
from writecol import *
a=array([0,2,2,5,7,8,4])
b=array([233,333,222,111,787,444,888])
titulo=['#Columna A','Columna B']
writecol('Archivo.dat',a,b,title=titulo)

¿El resultado? Un archivo como el siguiente:

#Columna A Columna B
0 233
2 333
2 222
5 111
7 787
8 444
4 888

¡Choro!, ¿no? Bueno, bonito...y barato (¡gratis, IDL!)

Saturday, September 11, 2010

Leer datos en Python: Como usar readcol, bajarlo, instalarlo, etc.

En realidad no ando con mucho tiempo, pero es un tip digno y rápido de compartir. En IDL, existía un lector de datos en columnas llamado readcol que yo encontraba muy útil, y bueno, me encontré con la sorpresa de que en Python también existe. El código lo pueden descargar acá: [~~Link~~]

¿Que cómo se "instala"? Fue mi misma duda. Primero hay que saber que carpetas lee Python antes de ejecutar los códigos. Para ello, en python hacemos:

>>> import sys
>>> print sys.path

Python lee estas carpetas antes de ejecutar algún código. El paso siguiente es bajar el código que puse más arriba (copiar y pegar el código), ponerlo en un archivo llamado "readcol.py" y posicionar ese archivo en alguna de las carpetas que aparecieron anteriormente (¡cualquiera sirve!). Ésto es como "instalar" el código en nuestro computador: Así de fácil es con Python.

Para usar la herramienta que ya "instalamos" en nuestro computador en nuestro código, simplemente agregamos al principio del mismo:

from readcol import *

Y listo. Supongamos que queremos leer las tres columnas de un archivo en la carpeta en la que estamos que se llama archivo.dat, y queremos pasar los datos a las variables X, Y, t. Para ello escribimos en nuestro código, una vez importado readcol:

X,Y,t=readcol('archivo.dat',twod=False)

¡Y listo! El "twod=False" es por que inicialmente estaba diseñado para leer solo dos columnas, por lo que se hacía "X,Y=readcol("archivo.dat")" simplemente. Pero cuando hay más "dimensiones" en las columnas, debemos agregar eso :). En realidad hay más formas de usarlo, y en el mismo archivo las pueden encontrar: ¡Encuentren la más cómoda para sus necesidades!

PD: Los arrays que nos entrega readcol son de NUMPY, no de NUMARRAY (por tanto cosas como X.pop(numero) ó X.append(otronumero) no funcionan...pero NUMPY siempre tiene solución para todo, léase: "Los análogos a append y pop".

Los análogos a list.pop y .list.append en NumPy

La verdad venía buscando algo así hace rato, por que me gusta ocupar el comando readcol (léase cómo usar readcol en Python) que es súper simple de usar en Python para leer datos, pero que agraciadamente (y ya verán por que) nos entrega arrays estilo NUMPY, y no NUMARRAY. En Python (bueno, NUMARRAY), uno al crear un array llamado "lista", por ejemplo que tenía los elementos [0,1,2,3,4], uno podía hacer:
>>> lista.pop(4)
Y eso eliminaba el cuarto elemento de mi array. Pasaba lo mismo con:
lista.append(numero)
Donde uno agregaba el valor "numero" al último elemento del array. En Numpy, los análogos a esto son mucho más generales y poderosos. El análogo a pop vendría siendo el comando delete. Con Numpy importado, si tenemos la misma lista pero creada "al estilo Numpy", o sea:

>>> from numpy import *
>>> lista=array([0,1,2,3,4,5,6,7,8,9,10])
Para ocupar el comando delete, por ejemplo, para borrar el elemento 2, 3 y 4 de mi array hago:
>>> lista = delete(lista,[2,3,4])
Y al imprimir mi lista en la línea de comandos, me queda:
>>> print lista
[0 1 5 6 7 8 9 10]
Ya, ok, ok. Pero...¡append si que era útil! Pues bien, efectivamente existe el comando append en Numpy. Para hacer lo mismo a mi lista a la que le borré los elementos de más arriba, y agregrale al final los valores 0.001 y 0.005, hacemos:
>>> lista=append(lista,[0.001,0.005])
Y al ver mis valores, obtengo:
>>> print lista
[0e0 1e0 5e0 6e0 7e0 8e0 9e0 10e0 1e-3 5e-3]
¡No se asusten! Es lo mismo, solo que nos convirtió todos nuestros datos a float :). Pero...supongamos que tenemos dos listas, lista1 y lista2 y los queremos unir...¿cómo lo hacemos más eficientemente? Ocupamos el comando hstack:
>>> lista=hstack([lista1,lista2])
¡Y listo! Ah...¿cuál es la diferencia? Que aquí jugué con matrices de rango 1 (vectores n-dimensionales). Lo que puse más arriba tiene muchas mejores aplicaciones a matrices: ¡Jueguen!