Solución:
El empotrado .npy
El formato de archivo está perfectamente bien para trabajar con pequeños conjuntos de datos, 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 se muestra una solución para ahorrar numpy
matrices en HDF5 con PyTables,
Paso 1: crea un extensible EArray
almacenamiento
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: agregar 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
Esta es una expansión de la respuesta de Mohit Pandey que muestra un ejemplo completo de guardar / cargar. Fue probado con 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)))
fuera = matriz ([[ 0., 0.], [ 1., 1.]])
.npy
Los archivos contienen un encabezado que tiene la forma y el tipo de la matriz. Si sabe cómo se ve su matriz resultante, puede escribir el encabezado usted mismo y luego los datos en trozos. 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 lo agrega), tendrá que recurrir a fseek
trucos como en [1].
Inspirado por
[1]: https://mail.scipy.org/pipermail/numpy-discussion/2009-August/044570.html (no funciona de fábrica)
[2]: https://docs.scipy.org/doc/numpy/neps/npy-format.html
[3]: https://github.com/numpy/numpy/blob/master/numpy/lib/format.py