python - type - Guardar matriz numpy en modo de añadir
type numpy array (5)
El formato de archivo .npy
es perfectamente .npy
para trabajar con conjuntos de datos pequeños, sin depender de módulos externos que no sean numpy
.
Sin embargo, cuando comienza a tener grandes cantidades de datos, se prefiere el uso de un formato de archivo, como HDF5, diseñado para manejar tales conjuntos de datos, [1] .
Por ejemplo, a continuación hay una solución para guardar matrices numpy
en HDF5 con PyTables ,
Paso 1: Crear un almacenamiento de EArray
extensible
import tables
import numpy as np
filename = ''outarray.h5''
ROW_SIZE = 100
NUM_COLUMNS = 200
f = tables.open_file(filename, mode=''w'')
atom = tables.Float64Atom()
array_c = f.create_earray(f.root, ''data'', atom, (0, ROW_SIZE))
for idx in range(NUM_COLUMNS):
x = np.random.rand(1, ROW_SIZE)
array_c.append(x)
f.close()
Paso 2: anexar filas a un conjunto de datos existente (si es necesario)
f = tables.open_file(filename, mode=''a'')
f.root.data.append(x)
Paso 3: leer un subconjunto de los datos
f = tables.open_file(filename, mode=''r'')
print(f.root.data[1:10,2:20]) # e.g. read from disk only this part of the dataset
¿Es posible guardar una matriz numpy agregándola a un archivo npy ya existente --- algo como np.save(filename,arr,mode=''a'')
?
Tengo varias funciones que tienen que iterar sobre las filas de una matriz grande. No puedo crear la matriz a la vez debido a restricciones de memoria. Para evitar crear las filas una y otra vez, quise crear cada fila una vez y guardarlas en un archivo adjuntándolas a la fila anterior del archivo. Más tarde, pude cargar el archivo npy en mmap_mode, accediendo a los segmentos cuando sea necesario.
Esta es una expansión de la respuesta de Mohit Pandey que muestra un ejemplo completo de guardar / cargar. Se probó utilizando Python 3.6 y Numpy 1.11.3.
from pathlib import Path
import numpy as np
import os
p = Path(''temp.npy'')
with p.open(''ab'') as f:
np.save(f, np.zeros(2))
np.save(f, np.ones(2))
with p.open(''rb'') as f:
fsz = os.fstat(f.fileno()).st_size
out = np.load(f)
while f.tell() < fsz:
out = np.vstack((out, np.load(f)))
out = array ([[0., 0.], [1., 1.]])
Para agregar datos a un archivo ya existente usando numpy.save, deberíamos usar:
f_handle = file(filename, ''a'')
numpy.save(f_handle, arr)
f_handle.close()
He comprobado que funciona en python 2.7 y numpy 1.10.4
He adaptado el código de here , que habla sobre el método savetxt.
Puedes probar algo como leer el archivo y luego agregar nuevos datos
import numpy as np
import os.path
x = np.arange(10) #[0 1 2 3 4 5 6 7 8 9]
y = np.load("save.npy") if os.path.isfile("save.npy") else [] #get data if exist
np.save("save.npy",np.append(y,x)) #save the new
después de 2 operaciones:
print(np.load("save.npy")) #[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9]
.npy
archivos .npy
contienen un encabezado que tiene la forma y el tipo de la matriz. Si sabe cómo se ve la matriz resultante, puede escribir el encabezado usted mismo y luego los datos en fragmentos. Por ejemplo, aquí está el código para concatenar matrices 2d:
import numpy as np
import numpy.lib.format as fmt
def get_header(fnames):
dtype = None
shape_0 = 0
shape_1 = None
for i, fname in enumerate(fnames):
m = np.load(fname, mmap_mode=''r'') # mmap so we read only header really fast
if i == 0:
dtype = m.dtype
shape_1 = m.shape[1]
else:
assert m.dtype == dtype
assert m.shape[1] == shape_1
shape_0 += m.shape[0]
return {''descr'': fmt.dtype_to_descr(dtype), ''fortran_order'': False, ''shape'': (shape_0, shape_1)}
def concatenate(res_fname, input_fnames):
header = get_header(input_fnames)
with open(res_fname, ''wb'') as f:
fmt.write_array_header_2_0(f, header)
for fname in input_fnames:
m = np.load(fname)
f.write(m.tostring(''C''))
Si necesita una solución más general (edite el encabezado en su lugar mientras agrega) tendrá que recurrir a trucos de fseek
como en [1].
Inspirado por
[1]: https://mail.scipy.org/pipermail/numpy-discussion/2009-August/044570.html (no funciona fuera de la caja)
[2]: https://docs.scipy.org/doc/numpy/neps/npy-format.html
[3]: https://github.com/numpy/numpy/blob/master/numpy/lib/format.py