Dans ce tutoriel, nous allons apprendre à sauvegarder des tableaux numpy pour ajouter de la persistence à votre application python.
Notre premiere persistence
Sauvegarde des données
Pour sauvegarder votre tableau NumPy, on utilise le comportement natif de python pour l’ouverture d’un fichier, et on appelle la function save de NumPy :
array = np.array([6, 9])
with open('array.npy', 'wb') as f:
np.save(f, array)
Le fichier en sortie utilise un format binaire spécifique numpy. Sur la première ligne, on trouve les paramètres de notre tableau persisté :
�NUMPYv{'descr': '<i8', 'fortran_order': False, 'shape': (2,), }
La suite du fichier est composé d’octets correspondant aux valeurs du tableau.
Chargement des données
Après avoir sauvegardé nos données, il faut pouvoir les charger. Pour cela, on
utilise la fonction load
de numpy :
with open('array.npy', 'rb') as f:
array2 = np.load(f)
print(array2)
Ce qui donne le résultat suivant :
[6 9]
Et voilà, on a notre première persistence de données avec numpy !
Persistence au format texte
Il arrive qu’on veuille utiliser des données traitées avec numpy dans un autre langage de programmation, ou par exemple sur excel. On doit donc enregistrer nos données dans un format compréhensible par tous.
Sauvegarde des données
On utilise une autre fonction de numpy savetxt
:
array = np.array([[6, 9, 42], [4, 2, 9]])
np.savetxt('array_float.csv', array, delimiter=',')
Le delimiter est le caractère au sein du fichier qui séparera nos valeurs. Les
délimiteurs courants sont ,
et ;
.
Notre fichier csv contient :
6.000000000000000000e+00,9.000000000000000000e+00,4.200000000000000000e+01
4.000000000000000000e+00,2.000000000000000000e+00,9.000000000000000000e+00
Les nombres sont enregistrés par défaut en nombre flottant, pour régler ça, on spécifie un format à notre export :
np.savetxt('array_int.csv', array, delimiter=',', fmt='%i')
Finalement, on obtient un format en entier :
6,9,42
4,2,9
Chargement des données
Maintenant pour charger nos données enregistrées en format texte, on utilise loadtxt
:
array_loaded_from_text = np.loadtxt('array_int.csv', delimiter=',', )
print(array_loaded_from_text)
[[ 6. 9. 42.]
[ 4. 2. 9.]]
Compression en archive gz
Si la quantité de données est conséquente, il peut être intéressant de
compresser les données enregistrées. La fonction de sauvegarde utilisée
précédemment savetxt
permet de compresser nativement les données, si le
fichier de sortie possède l’extension .gz (pour gzip ou GNU zip).
big_array = np.random.rand(1000, 1000) # tableau de 1000x1000
np.savetxt('array_test.csv', big_array, delimiter=',', fmt='%i')
np.savetxt('array_compressed.gz', big_array, delimiter=',', fmt='%i')
Fichier | Taille |
---|---|
.csv | 1954 Ko |
.gz | 4 Ko |
Le gain de place est très intéressant, cependant l’enregistrement et le chargement des données sauvegardées au format gz sera plus long.
Le chargement se fait de la même façon que précédemment, la fonction loadtxt
se charge de décompresser pour nous les données.
big_array_loaded = np.loadtxt('array_compressed.gz', delimiter=',')
Persistence au format npz
NumPy propose une dernière façon de persister vos données avec le format npz, qui a l’avantage de pouvoir sauvegarder plusieurs tableaux numpy dans le même fichier et contrairement au format texte, ce format supporte des tableaux à n dimensions
np.savez('test.npz', array=array, big_array=big_array)
loaded_npz = np.load('test.npz')
array_loaded_from_npz = loaded_npz['array']
big_array_loaded_from_npz = loaded_npz['big_array']
print(loaded_npz.files)
print(big_array_loaded_from_npz.shape)
Ce qui donne :
['array', 'big_array']
(1000, 1000)
De plus, NumPy propose avec le format npz
de compresser facilement les
données :
np.savez_compressed('test_compressed.npz', array=array, big_array=big_array)
loaded_npz = np.load('test_compressed.npz')
array_loaded_from_npz = loaded_npz['array']
big_array_loaded_from_npz = loaded_npz['big_array']
Comme pour loadtxt
la fonction load
se charge de décompresser
automatiquement.
Conclusion
Voilà, vous êtes maintenant capable de faire persister vos données numpy.