Je me demande comment enregistrer et charger numpy.array
correctement les données. Actuellement, j'utilise la numpy.savetxt()
méthode. Par exemple, si j'ai un tableau markers
, qui ressemble à ceci:
J'essaye de le sauvegarder en utilisant:
numpy.savetxt('markers.txt', markers)
Dans un autre script, j'essaye d'ouvrir le fichier précédemment enregistré:
markers = np.fromfile("markers.txt")
Et c'est ce que je reçois ...
Les données enregistrées ressemblent d'abord à ceci:
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
Mais quand je sauvegarde juste les données chargées en utilisant la même méthode, ce est à dire. numpy.savetxt()
ça ressemble à ceci:
1.398043286095131769e-76
1.398043286095288860e-76
1.396426376485745879e-76
1.398043286055061908e-76
1.398043286095288860e-76
1.182950697433698368e-76
1.398043275797188953e-76
1.398043286095288860e-76
1.210894289234927752e-99
1.398040649781712473e-76
Qu'est-ce que je fais mal? PS il n'y a pas d'autre opération "backstage" que j'effectue. Juste enregistrer et charger, et c'est ce que j'obtiens. Merci d'avance.
np.save()
etnp.load()
.scipy.io.savemat
etscipy.io.loadmat
.fromfile
est de lire les données sous forme binaire.loadtxt
est le bon appariement avecsavetxt
. Regardez la documentation de la fonction.Réponses:
Le moyen le plus fiable que j'ai trouvé pour le faire est d'utiliser
np.savetxt
avecnp.loadtxt
et nonnp.fromfile
ce qui convient le mieux aux fichiers binaires écrits avectofile
. Les méthodesnp.fromfile
andnp.tofile
écrivent et lisent des fichiers binaires tandis que rédigentnp.savetxt
un fichier texte. Ainsi, par exemple:Ou:
J'utilise l'ancienne méthode même si elle est plus lente et crée des fichiers plus volumineux (parfois): le format binaire peut dépendre de la plate-forme (par exemple, le format de fichier dépend de l'endianness de votre système).
Il existe un format indépendant de la plate- forme pour les tableaux NumPy, qui peut être enregistré et lu avec
np.save
etnp.load
:la source
.npy
les fichiers (générés par exemple parnp.save()
) sont indépendants de la plate-forme et seront plus compacts et plus rapides à créer que les fichiers texte.np.savez
si vous voulez que la sortie soit compressée.np.savez
enregistre plusieurs tableaux non compressés -np.savez_compressed
les compressera - il n'y en a pasnp.save_compressed
encore. Voir docs.scipy.org/doc/numpy-1.15.1/reference/routines.io.htmlla source
pickle
?x = db["x"]
suivi dey = db["y"]
?np.fromfile()
a unsep=
argument de mot - clé:La valeur par défaut de
sep=""
signifie quenp.fromfile()
tente de le lire comme un fichier binaire plutôt que comme un fichier texte séparé par des espaces, de sorte que vous récupérez des valeurs absurdes. Si tu utilisesnp.fromfile('markers.txt', sep=" ")
vous obtiendrez le résultat que vous recherchez.Cependant, comme d'autres l'ont souligné,
np.loadtxt()
c'est le moyen préféré de convertir des fichiers texte en tableaux numpy, et à moins que le fichier ne doive être lisible par l'homme, il est généralement préférable d'utiliser des formats binaires à la place (par exemplenp.load()
/np.save()
).la source
pickle
?Pour une réponse courte, vous devez utiliser
np.save
etnp.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 exempleRé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!
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
.npzformat.
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!)hdf5
pour les gros fichiers. Cool! https://stackoverflow.com/a/9619713/1601580Notez que ce n'est pas une réponse exhaustive. Mais pour d'autres ressources, vérifiez ceci:
np.save
): Enregistrer Numpy Array à l'aide de Picklela source