sábado, 25 de enero de 2020

Leer y escribir arrays Numpy en archivos



Para guardar de manera permanente los datos de memoria de un array Numpy para su posterior uso existen distintas opciones según sea el archivo de tipo binario, texto y CSV (Valores separados por comas).


Leer y escribir arrays Numpy en archivos de texto


loadtxt() y savetxt()


Leer y escribir los datos de arrays en archivos de texto.

# Escribir en un archivo de texto un array (10x3) generado
# con números aleatorios del 1 al 4:

a = np.random.randint(1, 5, (10,3), dtype=np.int8)
print(a)

# [[4 3 4]
#  [3 2 2]
#  [3 3 1]
#  [3 1 3]
#  [3 3 1]
#  [4 1 3]
#  [4 2 3]
#  [4 1 3]
#  [3 4 3]
#  [4 4 3]]

np.savetxt('datos.txt', a)


# Leer los datos de un archivo de texto y declarar un array:

a = np.loadtxt('datos.txt')
print(a)

# [[4. 3. 4.]
#  [3. 2. 2.]
#  [3. 3. 1.]
#  [3. 1. 3.]
#  [3. 3. 1.]
#  [4. 1. 3.]
#  [4. 2. 3.]
#  [4. 1. 3.]
#  [3. 4. 3.]
#  [4. 4. 3.]]


Leer y escribir arrays Numpy en archivos CSV


loadtxt() y savetxt()


Leer y escribir los datos de arrays en archivos CSV (valores separados por comas).

# Escribir en un archivo CSV un array (10x3) generado con 
# números aleatorios del 1 al 4:

a = np.random.randint(1, 5, (10,3))
print(a)
np.savetxt("datos.csv", a, delimiter=",")

# [[1 2 2]
#  [2 1 4]
#  [3 1 1]
#  [3 3 1]
#  [3 3 3]
#  [4 2 3]
#  [2 2 1]
#  [3 2 4]
#  [1 2 4]
#  [3 4 2]]


# Leer los datos de un archivo CSV y declarar un array:

a = np.loadtxt('datos.csv', dtype=np.int8, delimiter=',', skiprows=0)
print(a)

# [[1 2 2]
#  [2 1 4]
#  [3 1 1]
#  [3 3 1]
#  [3 3 3]
#  [4 2 3]
#  [2 2 1]
#  [3 2 4]
#  [1 2 4]
#  [3 4 2]]


Leer y escribir los datos de arrays en archivos binarios


fromfile() y tofile()


Leer y escribir los datos de arrays en archivos binarios.

# Escribir en un archivo binario un array (10x3) generado
# con números aleatorios del 1 al 4:

a = np.random.randint(1, 5, (10,3), dtype=np.int8)
print(a)

# [[4 3 4]
#  [3 2 2]
#  [3 3 1]
#  [3 1 3]
#  [3 3 1]
#  [4 1 3]
#  [4 2 3]
#  [4 1 3]
#  [3 4 3]
#  [4 4 3]]

a.tofile('datos.dat')


# Leer los datos del archivo binario y declarar un array:

# Cuando se leen los datos con fromfile() se crea un vector 
# con 30 elementos porque los datos binarios se guardan de 
# forma consecutiva. Para obtener el array bidimensional 
# original después de leer hay que convertir el vector en un
# array 2D (10x3) con el método reshape().

a = np.fromfile('datos.dat', dtype=np.int8)
a = a.reshape(10, 3)
print(a)

# [[4 3 4]
#  [3 2 2]
#  [3 3 1]
#  [3 1 3]
#  [3 3 1]
#  [4 1 3]
#  [4 2 3]
#  [4 1 3]
#  [3 4 3]
#  [4 4 3]]


Leer y escribir cadenas de texto en archivos binarios


fromfile() y write()


Leer y escribir cadenas de texto en archivos.

# Para escribir una cadena en un archivo binario:

cadena = b'Python para impacientes'
archivo = open('datos.dat', 'wb')
archivo.write(cadena)
archivo.close()


# Para leer la cadena y declarar el array:

a = np.fromfile('datos.dat', count=6, dtype='S1')
print(a) 

# [b'P' b'y' b't' b'h' b'o' b'n']

# Consultar otros argumentos admitidos: sep y offset


Leer y escribir listas en archivos binarios


pickle.load(), pickle.dump()


Leer y escribir listas Python en archivos binarios. Después de leer una lista de un archivo para convertir a array utilizar el método asarray().

# Escribir una lista en un archivo binario (con pickle):

import pickle
lista = [0.1, 0.2, 0.3, 0.4, 0.5]
archivo = open('datos.dat', 'wb')
pickle.dump(lista, archivo)
archivo.close()


# Leer la lista y declarar el array:

archivo = open('datos.dat', 'rb')
lista = pickle.load(archivo)
a = np.asarray(lista)
archivo.close()

print(a)  

# [0.1 0.2 0.3 0.4 0.5])