Sauvegarder une matrice de données de grande taille et/ou de plusieurs dimensions dans un fichier hdf5 en python ?

Daidalos October 21, 2019


Pour sauvegarder dans un fichier, des données stockées dans une matrice il existe plusieurs approches. Dans le cas d'un simple tableau de données avec quelques colonnes et/ou lignes on peut utiliser un simple fichier ascii ou un fichier csv. Cependant, si les données sont stockées dans des matrices à plusieurs dimensions ou si le volume de données est important il est préférable par exemple d'utiliser le format de données hdf5. Exemple avec python de comment créer un fichier hdf5, stocker les données et lire un fichier hdf5:

Créer des tableaux de données

Considérons les matrices suivantes avec des nombres entiers (dtype='i'):

>>> import numpy as np
>>> A = np.random.randint(100, size=(4,4))
>>> A
array([[ 1, 99, 79, 46],
       [69,  4, 29, 60],
       [56, 94, 16, 16],
       [52, 13, 37, 86]])

et une matrice B de dimensions (5,3,3)

>>> B = np.random.randint(100, size=(5,3,3))
>>> B
array([[[60, 89, 24],
        [ 4, 98, 48],
        [19, 39, 69]],

       [[72,  8, 80],
        [70, 96, 81],
        [50, 78, 85]],

       [[21, 91,  5],
        [43, 18, 58],
        [93, 48, 72]],

       [[25,  0, 45],
        [ 0, 21,  4],
        [ 5, 60, 39]],

       [[73, 28, 87],
        [97, 89, 87],
        [ 4, 76, 62]]])

Créer un fichier hdf5

Maintenant on va voir comment sauvegarder ces matrices dans un fichier hdf5. Première étape il faut importer le module h5py (hdf5 est installer par défaut avec anaconda)

>>> import h5py

Note: Si hdf5py n'est pas installer voir Quick Start Guide.

Créer un fichier hdf5 nomme par exemple data.hdf5:

>>> f1 = h5py.File("data.hdf5", "w")

Sauvegarder des données

Sauvegarder la matrice A dans le fichier hdf5:

>>> dset1 = f1.create_dataset("dataset_01", (4,4), dtype='i', data=A)

Sauvegarder la matrice B dans le fichier hdf5:

>>> dset2 = f1.create_dataset("dataset_02", (5,3,3), dtype='i', data=B)

Ajouter des metadata

L'avantage du format hdf est de pouvoir facilement attacher des metadata à une dataset par exemple on peut faire:

>>> dset1.attrs['scale'] = 0.01
>>> dset1.attrs['offset'] = 15

Fermer le fichier:

>>> f1.close()

Lire un fichier hdf5

Maintenant on va voir comment récupérer nos données. Lire le fichier hdf5:

>>> f2 = h5py.File('data.hdf5', 'r')

Afficher les noms des datasets dans le fichier hdf5:

>>> list(f2.keys())
['dataset_01', 'dataset_02']

ici on a bien deux datasets.

Récupérer les données:

>>> dset1 = f2['dataset_01']

>>> data = dset1[:]
>>> data
array([[ 1, 99, 79, 46],
       [69,  4, 29, 60],
       [56, 94, 16, 16],
       [52, 13, 37, 86]], dtype=int32)

>>> list(dset1.attrs.keys())
['scale', 'offset']

>>> dset1.attrs['scale']
0.01

Exemple avec dataset 2 contenant la matrice B:

>>> dset2 = f2['dataset_02']
>>> dset2
<HDF5 dataset "dataset_02": shape (5, 3, 3), type "<i4">
>>> data = dset2[:]
>>> data
array([[[60, 89, 24],
        [ 4, 98, 48],
        [19, 39, 69]],

       [[72,  8, 80],
        [70, 96, 81],
        [50, 78, 85]],

       [[21, 91,  5],
        [43, 18, 58],
        [93, 48, 72]],

       [[25,  0, 45],
        [ 0, 21,  4],
        [ 5, 60, 39]],

       [[73, 28, 87],
        [97, 89, 87],
        [ 4, 76, 62]]], dtype=int32)
>>> type(data)
<class 'numpy.ndarray'>

Exemple avec une pandas data frame

Creer une data frame

import pandas as pd
import numpy as np

data = np.arange(1,13)
data = data.reshape(3,4)

columns = ['Home','Car','Sport','Food']
index = ['Alice','Bob','Emma']

df = pd.DataFrame(data=data,index=index,columns=columns)

et la sauvegarder dans un fichier hdf5 avec HDFStore
(voir Save additional attributes in Pandas Dataframe)

store = pd.HDFStore('data.hdf5')

store.put('dataset_01', df)

metadata = {'scale':0.1,'offset':15}

store.get_storer('dataset_01').attrs.metadata = metadata

store.close()

Lire le fichier:

import pandas as pd

with pd.HDFStore('data.hdf5') as store:
    data = store['dataset_01']
    metadata = store.get_storer('dataset_01').attrs.metadata

print(data)

print(metadata)

donne

       Home  Car  Sport  Food
Alice     1    2      3     4
Bob       5    6      7     8
Emma      9   10     11    12
{'scale': 0.1, 'offset': 15}

Références

Liens Site
Quick Start Guide docs.h5py.org
How to store a dataframe using Pandas stackoverflow
Attributes docs.h5py
How to use HDF5 files in Python pythonforthela
How to list dataset in h5py file? stackoverflow
How to add meta_data to Pandas dataframe? stackoverflow
Adding meta-information/metadata to pandas DataFrame stackoverflow
Using HDFStore riptutorial
Save additional attributes in Pandas Dataframe stackoverflow
pandas.read_hdf pandas.pydata.org
How to: Get the DataFrame metadata kite.com

Licence


Activity


Google Ads


Tags


HDF5 Big Data Python