Pour une réponse courte, vous devez utiliser np.save
et np.load
. Les avantages de ceux-ci sont qu'ils sont fabriqués par les développeurs de la bibliothèque numpy et qu'ils fonctionnent déjà (et sont probablement déjà bien optimisés), par exemple
import numpy as np
from pathlib import Path
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2
np.save(path/'x', x)
np.save(path/'y', y)
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
print(x is x_loaded) # False
print(x == x_loaded) # [[ True True True True True]]
Réponse étendue:
En fin de compte, cela dépend vraiment de vos besoins car vous pouvez également l'enregistrer au format lisible par l'homme (voir ce vidage d'un tableau NumPy dans un fichier csv ) ou même avec d'autres bibliothèques si vos fichiers sont extrêmement volumineux (voir cette meilleure façon de préserver les tableaux numpy sur disque pour une discussion approfondie).
Cependant, (en faisant une extension puisque vous utilisez le mot «correctement» dans votre question) je pense toujours que l'utilisation de la fonction numpy prête à l'emploi (et la plupart du code!) Satisfera probablement la plupart des besoins des utilisateurs. La raison la plus importante est que cela fonctionne déjà . Essayer d'utiliser autre chose pour toute autre raison pourrait vous amener dans un terrier de lapin inattendu LONG pour comprendre pourquoi cela ne fonctionne pas et le forcer à fonctionner.
Prenons l'exemple d'essayer de l'enregistrer avec du cornichon. J'ai essayé cela juste pour le plaisir et il m'a fallu au moins 30 minutes pour réaliser que pickle ne sauverait pas mes affaires à moins que j'ouvre et lisais le fichier en mode octets avec wb
. Il a fallu du temps pour google, essayer quelque chose, comprendre le message d'erreur etc ... Petit détail mais le fait que cela m'obligeait déjà à ouvrir un fichier compliquait les choses de manière inattendue. Pour ajouter qu'il m'a fallu relire ceci (quel btw est un peu déroutant) Différence entre les modes a, a +, w, w + et r + dans la fonction ouverte intégrée?.
Donc, s'il y a une interface qui répond à vos besoins, utilisez-la sauf si vous avez un ( très ) bonne raison (par exemple, compatibilité avec matlab ou pour une raison quelconque, vous voulez vraiment lire le fichier et l'impression en python ne répond vraiment pas à vos besoins, ce qui pourrait être discutable). De plus, si vous avez besoin de l'optimiser, vous le saurez probablement plus tard (plutôt que de passer des années à déboguer des choses inutiles comme ouvrir un simple fichier numpy).
Utilisez donc l'interface / numpy fournit . Ce n'est peut-être pas parfait, c'est très probablement bien, en particulier pour une bibliothèque qui existe depuis aussi longtemps que numpy.
J'ai déjà passé la sauvegarde et le chargement de données avec numpy de plusieurs façons, alors amusez-vous avec, j'espère que cela vous aidera!
import numpy as np
import pickle
from pathlib import Path
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2
# using save (to npy), savez (to npz)
np.save(path/'x', x)
np.save(path/'y', y)
np.savez(path/'db', x=x, y=y)
with open(path/'db.pkl', 'wb') as db_file:
pickle.dump(obj={'x':x, 'y':y}, file=db_file)
## using loading npy, npz files
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
db = np.load(path/'db.npz')
with open(path/'db.pkl', 'rb') as db_file:
db_pkl = pickle.load(db_file)
print(x is x_loaded)
print(x == x_loaded)
print(x == db['x'])
print(x == db_pkl['x'])
print('done')
Quelques commentaires sur ce que j'ai appris:
np.save
comme prévu, cela le compresse déjà bien (voir https://stackoverflow.com/a/55750128/1601580 ), fonctionne hors de la boîte sans aucune ouverture de fichier. Nettoyer. Facile. Efficace. Utilise le.
np.savez
utilise un format non compressé (voir la documentation ) Save several arrays into a single file in uncompressed
.npz format.
Si vous décidez de l'utiliser (vous avez été averti de vous éloigner de la solution standard, attendez-vous à des bogues!), vous pourriez découvrir que vous devez utiliser des noms d'argument pour l'enregistrer, à moins que vous ne vouliez utilisez les noms par défaut. Donc, ne l'utilisez pas si le premier fonctionne déjà (ou si toute œuvre l'utilise!)
- Pickle permet également l'exécution de code arbitraire. Certaines personnes peuvent ne pas vouloir l'utiliser pour des raisons de sécurité.
- les fichiers lisibles par l'homme coûtent cher à créer, etc. Cela n'en vaut probablement pas la peine.
- il y a quelque chose qui s'appelle
hdf5
pour les gros fichiers. Cool! https://stackoverflow.com/a/9619713/1601580
Notez que ce n'est pas une réponse exhaustive. Mais pour d'autres ressources, vérifiez ceci: