Introducción al análisis de datos en Python con Numpy

Arrays y persistencia

Para despedir el curso vamos a aprender algunas funciones muy útiles que nos permitirán almacenar nuestros arrays en ficheros. Vienen bien si estamos trabajando y necesitamos almacenar nuestros datos para recuperarlos en otro momento y hacer uso de ellos.

Veremos dos métodos, el clásico en ficheros binarios y la variante en formato de texto. La diferencia entre ambos formatos es que los primeros no se pueden abrir con un editor de texto y editarlos, pero los segundos sí, así que permiten hacer cambios en vivo. A cambio los ficheros binarios pueden almacenar varios arrays y los ficheros de texto únicamente un array por fichero, así que utilizad las dos formas dependiendo de vuestros intereses.

Para más información sobre la persistencia buscad la sección pertinente en la documentación oficial en este enlace.

Guardado binario

# %%
import numpy as np

arr_1 = np.random.randint(0,4,[3,3])
arr_1

# Para guardarlo utilizamos la ruta y la extensin .npy
np.save('arr_1.npy', arr_1)

En esto punto tendríamos en el mismo directorio donde hemos ejecutado el comando el fichero array.npy. Si indicamos un directorio hasta el fichero lo crearemos ahí, pero tenemos que estar seguros de que el directorio existe y de que tengamos permisos para escribir.

# Ahora eliminamos el array  para asegurarnos de que ya no existe
del(arr_1)
arr_1

# Y lo cargamos de nuevo
arr_1 = np.load('arr_1.npy')
arr_1

De esta forma podemos guardar y leer un array en un fichero, pero podemos guardar y recuperar varios a la vez:

arr_2 = np.random.randint(-4,0,[3,3])

# Utilizaremos savez para guardar de forma comprimida con la extensión .npz
# Especificaremos una clave para cada array que queramos guardar
np.savez('arrays.npz', arr_1=arr_1, arr_2=arr_2)

# Ahora los borramos
del(arr_1)
del(arr_2)

# Y los cargamos de nuevo
arrays = np.load('arrays.npy')
arrays

Como véis el objeto recuperado es un NpzFile, en realidad es como un diccionario así que podemos recuperar los arrays a partir del nombre con que los hemos guardado:

arrays['arr_1']

arrays['arr_2']

Guardado en texto

Básicamente se hace de la misma forma, pero las funciones cambian:

  • Para guardar de save -> savetxt
  • Para cargar de load -> loadtxt
# Creamos un array de prueba
arr_3 = np.random.randint(-10,10,[3,3])
arr_3

# Lo guardamos en un fichero de texto, el formato es libre
np.savetxt('arr_3.txt', arr_3)

Por defecto los arrays en ficheros de texto se guardan con filas separadas por saltos de línea y columnas separadas por espacios:

2.000000000000000000e+00 -4.000000000000000000e+00 -6.000000000000000000e+00
7.000000000000000000e+00 -5.000000000000000000e+00 -7.000000000000000000e+00
-1.000000000000000000e+01 -4.000000000000000000e+00 -1.000000000000000000e+01

Pero podemos establecer el separador a voluntad:

# Columnas con ,
np.savetxt('arr_3.txt', arr_3, delimiter=',')

Esto generaría algo como:

-6.000000000000000000e+00,9.000000000000000000e+00,-8.000000000000000000e+00
0.000000000000000000e+00,3.000000000000000000e+00,6.000000000000000000e+00
4.000000000000000000e+00,0.000000000000000000e+00,4.000000000000000000e+00

No importa cómo lo guardemos, lo importante es que a la hora de recuperarlos indiquemos los separadores si los hemos cambiado:

# Lo borramos
del(arr_3)

# Lo cargamos indicando el separador (si lo hemos cambiado)
arr_3 = np.loadtxt('arr_3.txt', delimiter=',')
arr_3