Input e output di array numpy in h5py


100

Ho un codice Python il cui output è una inserisci qui la descrizione dell'immaginematrice dimensionata, le cui voci sono tutte del tipo float. Se lo salvo con l'estensione, .datla dimensione del file è dell'ordine di 500 MB. Ho letto che l'utilizzo h5pyriduce notevolmente le dimensioni del file. Quindi, diciamo che ho chiamato l'array numpy 2D A. Come lo salvo in un file h5py? Inoltre, come faccio a leggere lo stesso file e a inserirlo come array numpy in un codice diverso, poiché devo eseguire manipolazioni con l'array?


4
Come lo salvi con l' .datestensione?
jorgeca

@jorgeca: per quello lo faccio e bastanp.savetxt("output.dat",A,'%10.8e')
lovespeed

3
Grazie (l'estensione da sola non significa molto, potrebbe essere memorizzata come binario, ascii ...). A meno che tu non abbia bisogno delle funzionalità extra di hdf5, userei semplicemente np.save('output.dat', A)che lo salverà in un formato binario (molto più veloce, molto meno spazio utilizzato).
jorgeca

@jorgeca ma un altro script python sarà in grado di leggerlo come un array 2D quando lo chiamo comeA = np.loadtxt('output.dat',unpack=True)
lovespeed

2
quindi h5pynon crea file più piccoli di quelli che np.savefarebbero? è h5pypiù veloce che np.saveper gli array delle dimensioni indicate nella domanda?
dbliss

Risposte:


131

h5py fornisce un modello di set di dati e gruppi . Il primo è fondamentalmente array e il secondo può essere considerato come directory. Ciascuno è denominato. Dovresti guardare la documentazione per l'API e gli esempi:

http://docs.h5py.org/en/latest/quick.html

Un semplice esempio in cui stai creando tutti i dati in anticipo e vuoi solo salvarli in un file hdf5 sarebbe simile a:

In [1]: import numpy as np
In [2]: import h5py
In [3]: a = np.random.random(size=(100,20))
In [4]: h5f = h5py.File('data.h5', 'w')
In [5]: h5f.create_dataset('dataset_1', data=a)
Out[5]: <HDF5 dataset "dataset_1": shape (100, 20), type "<f8">

In [6]: h5f.close()

È quindi possibile caricare nuovamente i dati utilizzando: '

In [10]: h5f = h5py.File('data.h5','r')
In [11]: b = h5f['dataset_1'][:]
In [12]: h5f.close()

In [13]: np.allclose(a,b)
Out[13]: True

Sicuramente controlla i documenti:

http://docs.h5py.org

La scrittura nel file hdf5 dipende da h5py o pytables (ognuno ha un'API python diversa che si trova in cima alla specifica del file hdf5). Dovresti anche dare un'occhiata ad altri semplici formati binari forniti da numpy in modo nativo come np.save, np.savezecc:

http://docs.scipy.org/doc/numpy/reference/routines.io.html


Btw. se durante la lettura non si conosce il nome del set di dati, è necessario analizzare il file hdf in modo simile a qui .
Trilarion

@ JoshAdel se voglio aggiungere una colonna al set di dati. il mio set di dati è un np.array multidimensionale indicizzato come [img_id, righe, colonne, canali]. e l'ho salvato usando il metodo descritto nella tua risposta. Accedo a tutti i punti del set di dati utilizzando h5f ['dataset_1'] [img_id]. quello che voglio è un modo per aggiungere un'altra colonna ad esempio "mycolumn" ... corrispondente a ogni img_id nel set di dati. come dovrei aggiungere un'altra colonna a questo così posso fare h5f ['mycolumn'] [img_id]?
iratzhash

Se scrivo matrici come questa, non riesco a vederle con HDFView 2.11: posso aprire il file, posso vedere che il set di dati data.h5esiste, ma non riesco a visualizzarlo con HDFView. Posso leggere i contenuti con h5py, ma non ispezionarli con HDFView. Qualche idea sul perché?
Martin Thoma

104

Un modo più pulito per gestire l'apertura / chiusura dei file ed evitare perdite di memoria:

Preparazione:

import numpy as np
import h5py

data_to_write = np.random.random(size=(100,20)) # or some such

Scrivi:

with h5py.File('name-of-file.h5', 'w') as hf:
    hf.create_dataset("name-of-dataset",  data=data_to_write)

Leggere:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]

2
Non è necessario chiudere il file?
ricoamor

23
@DrDeSancho no, la dichiarazione con
Leonid

1
particolarmente utile quando si esegue in modalità interattiva (perché altrimenti si rischia di ottenere un'eccezione da h5py su un file già aperto quando si esegue nuovamente lo stesso codice senza chiudersi correttamente al primo tentativo)
Andre Holzner

La withcaratteristica di Python è nota come gestore di contesto. Si assicurerà che il file venga chiuso dopo che è stato utilizzato. Maggiori informazioni sono disponibili nella documentazione ufficiale: docs.python.org/3/library/contextlib.html
Mark
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.