2017-09-28 1 views
0

J'ai souvent traité des tableaux numpy qui résultent de longs calculs. Je dois les utiliser ailleurs dans les calculs. Je les «pickle» actuellement et je dépilage les fichiers dans des variables au fur et à mesure que j'en ai besoin.meilleure façon de stocker des tableaux numpy dans des fichiers ascii

J'ai remarqué que pour les grandes tailles de données (~ 1M points de données), c'est lent. J'ai lu ailleurs que le décapage n'est pas le meilleur moyen de stocker des fichiers volumineux. Je voudrais les stocker et les lire en tant que fichiers ASCII efficacement pour charger directement dans un tableau numpy. Quelle est la meilleure façon de procéder? Disons que j'ai un tableau 2D de 100k x 3 dans une variable 'a'. Je veux le stocker dans un fichier ASCII et le charger dans une variable de tableau numpy 'b'.

Répondre

3

Numpy a une plage de input and output methods qui fera exactement ce que vous recherchez.

Une option serait numpy.save:

import numpy as np 

my_array = np.array([1,2,3,4]) 
with open('data.txt', 'wb') as f: 
    np.save(f, my_array, allow_pickle=False) 

Pour charger à nouveau vos données:

with open('data.txt', 'rb') as f: 
    my_loaded_array = np.load(f) 
3

Si vous voulez l'efficacité, ASCII ne sera pas le cas. Le problème avec pickle est que cela dépend de la version python, donc ce n'est pas une bonne idée pour le stockage à long terme. Vous pouvez essayer d'utiliser d'autres technologies binaires, où la solution la plus simple consisterait à utiliser la méthode numpy.save telle que documentée here.

2

Le problème que vous pose est directement liée à la taille de l'ensemble de données.

Il existe plusieurs solutions à ce problème assez courant qui viennent avec des bibliothèques spécialisées.

  1. Python seule la persistance: JOBLIB offre un alternative to pickle spécifiquement pour le stockage des fichiers trop volumineux pour le décapage pratique.
  2. HDF5 est un format de fichier spécifiquement destiné au stockage de tableaux. Le format est multi-langue et multi-plateforme, mais il existe une très bonne bibliothèque Python:

Un exemple avec h5py. Pour écrire les données:

import h5py 
with h5py.File('data.h5', 'w') as f: 
    f.create_dataset('a', data=a) 

Pour lire les données:

import h5py 
with h5py.File('data.h5', 'r') as f: 
    b = f['a'][:] 
+0

Je pense que hdf5 semble être la bonne option pour mon application. Comme ma question était de stocker en fichiers ASCII (je voulais dire lisible par l'homme), j'ai accepté l'option np.save comme réponse. Merci pour vos contributions. –

+0

Assez juste, merci pour la mention. J'espère que d'autres le trouveront utile, même s'ils chercheraient un stockage ascii :-) –