Saltar al contenido

guardar la matriz numpy en modo adjuntar

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *