domingo, 24 de enero de 2021

6) Lectura y escritura de datos con Numpy.





Lectura y Escritura de datos.



En este post veremos brevemente como leer datos de un archivo con numpy y también como escribirlos. Es algo que usaremos muy frecuentemente, ya sea porque hemos recogido datos de un sensor de la rapsberry pi que tenemos guardado en un fichero, porque nos lo han mandado para que los utilicemos o porque queremos separar la parte que se refiere al programa de la parte de los datos.

Numpy nos ofrece varias funciones para poder leer y escribir datos numéricos en archivos simples que tengan un diseño en formato columna. Los comentarios y los delimitadores de columna se manejan automáticamente.

Lectura.


Numpy nos ofrece varias funciones para poder cargar datos, pero la que usaremos con mayor frecuencia es la función loadtxt.

Vamos a verlo con un ejemplo. Supón que tenemos los siguientes datos en un archivo llamado datos.dat. No es más que un archivo con los siguientes datos:

# x y
-4 5
3 9
2 12
# -4 11 >> dato invalido!!
7 nan
5 21
6 20

Vamos a leer los datos en forma de array de Numpy con tan solo llamar a la función loadtxt().

>>> import numpy as np
>>> xy = np.loadtxt("datos.dat")
>>> print(xy)
[[-4.  5.]
 [ 3.  9.]
 [ 2. 12.]
 [ 7. nan]
 [ 5. 21.]
 [ 6. 20.]]


Como puedes ver es muy sencillo. Comentemos algunos aspectos de como funciona loadtxt:

- La función lee todas las líneas, saltándose las líneas que contengan comentarios es decir las que comiencen por #. Esto se podría cambiar utilizando el parámetro comments. También podrías saltar las n primeras líneas, utilizando el parámetro skiprows.

- El valor indefinido (nan) se reconoce automáticamente.

- El programa espera que los datos dentro de cada línea estén separados por espacios. Esto se podría cambiar usando el parámetro delimeter

- El tipo de datos de la matriz Numpy se elige automáticamente en función de los valores, aunque por defecto nos devolverá un array con datos de tipo float. (Si quieres cambiarlo puedes usar el argumento dtype).

Otras funciones que también sirven para leer datos son:

- La función load sirve para leer datos en el formato comprimido de Numpy, que suele tener las extensiones npy o npz.

- La función fromfile sirve para leer los datos en formato binario.

- La función genfromtxt es mucho más flexible que loadtxt y es muy útil cuando el archivo está mal formateado o faltan datos. Sin embargo en la mayor parte de los casos loadtxt es más que suficiente.


Escritura.


Si la función para leer datos es loadtxt te puedes imaginar que para escribir datos a un archivo la función será savetxt. Tiene dos argumentos obligatorios el nombre del archivo y el array a guardar.

Podemos poner un encabezado al archivo con el argumento header.

También podemos usar un delimitador distinto de los espacios, que es el establecido por defecto, usando el argumento delimiter. 

 Y tambien podemos definir el fomato de los datos que por defecto se guardan con 18 cifras decimales con el parámetro fmt.

Veámoslo todo esto en un ejemplo.

Podemos poner los argumentos de esta forma o también lo puedes poner dentro de la función como normalmente hacemos:

>>> import numpy as np

>>> argumentos = {
    'header':'ejemplo de archivo',
    'fmt':'%7.3f',
    'delimiter':','
}

Creamos el array y lo guardamos.

>>> xy = np.array([[123.3434,34.55656],[-123233.232323,223323.32],[58,4545]])
>>> np.savetxt('archivo.dat', xy, **argumentos)

Si abrimos el archivo con un editor de textos vemos que el contenido es:

# ejemplo de archivo
123.343, 34.557
-123233.232,223323.320
 58.000,4545.000

y hasta aquí este capítulo.


EJERCICIO

En este ejercicio vamos a repasar lo que hemos visto sobre como escribir y leer arrays en el disco.

Lo primero que tenemos que hacer es crear un archivo de texto que contenga los siguientes datos.

0.012 1.243

1.338 0.321

1.177 0.742

1.431 0.500

1.232 1.901

0.697 1.432

1.499 0.725

1.403 0.543

1.173 0.123

0.555 1.054

Le llamaré prueba.dat.  Como veis, este archivo, contiene pares de valores de coordenadas x e y. 

Lo primero que haremos será leer los datos del archivo en Numpy con la función numpy.loadtxt().

Lugo vamos a sustituir todos los valores y por el número 4.5 para luego volver a guardar los arrays en un nuevo archivo con la función numpy.savetxt().


SOLUCIÓN


>>> import numpy as np

>>> archivo=np.loadtxt("prueba.dat") #cargamos los datos
print(archivo)
[[0.012 1.243]
 [1.338 0.321]
 [1.177 0.742]
 [1.431 0.5  ]
 [1.232 1.901]
 [0.697 1.432]
 [1.499 0.725]
 [1.403 0.543]
 [1.173 0.123]
 [0.555 1.054]]

>>> archivo[:,1:]=4.5 #cambiamos todos los valores de y por 4.5
>>> print(archivo)
[[0.012 4.5  ]
 [1.338 4.5  ]
 [1.177 4.5  ]
 [1.431 4.5  ]
 [1.232 4.5  ]
 [0.697 4.5  ]
 [1.499 4.5  ]
 [1.403 4.5  ]
 [1.173 4.5  ]
 [0.555 4.5  ]]

# para guardar solo existen 2 argumentos obligatorios que es nombre del archivo
# y array para guardar los datos que por defecto lo hace con 18 números decimales
# pero se puede modificar con el comando fmt '%entero.decimalf' parecido al format de strings
>>> np.savetxt("ejercicio.dat",archivo, fmt='%1.3f')



Próximo Post. Números aleatorios en Numpy.


No hay comentarios:

Publicar un comentario