web-dev-qa-db-fra.com

Comment enregistrer et charger correctement les données numpy.array ()?

Je me demande comment enregistrer et charger correctement les données numpy.array. J'utilise actuellement la méthode numpy.savetxt(). Par exemple, si j'ai un tableau markers, qui ressemble à ceci:

enter image description here

J'essaie de le sauver en utilisant:

numpy.savetxt('markers.txt', markers)

Dans un autre script, j'essaie d'ouvrir le fichier précédemment enregistré:

markers = np.fromfile("markers.txt")

Et c'est ce que je reçois ...

enter image description here

Les données sauvegardé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 lorsque je sauvegarde des données chargées en utilisant la même méthode, c.-à-d. numpy.savetxt() cela 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, je n’exécute aucune autre opération "en coulisses". Juste enregistrer et charger, et c'est ce que je reçois. Merci d'avance.

59
bluevoxel

Le moyen le plus fiable que j'ai trouvé est d'utiliser np.savetxt avec np.loadtxt et non pas np.fromfile qui convient mieux aux fichiers binaires écrits avec tofile. Les méthodes np.fromfile et np.tofile écrivent et lisent des fichiers binaires alors que np.savetxt écrit un fichier texte. Donc, par exemple:

In [1]: a = np.array([1, 2, 3, 4])
In [2]: np.savetxt('test1.txt', a, fmt='%d')
In [3]: b = np.loadtxt('test1.txt', dtype=int)
In [4]: a == b
Out[4]: array([ True,  True,  True,  True], dtype=bool)

Ou:

In [5]: a.tofile('test2.dat')
In [6]: c = np.fromfile('test2.dat', dtype=int)
In [7]: c == a
Out[7]: array([ True,  True,  True,  True], dtype=bool)

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 du fichier dépend de l'endianité 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 et np.load:

In  [8]: np.save('test3.npy', a)    # .npy extension is added if not given
In  [9]: d = np.load('test3.npy')
In [10]: a == d
Out[10]: array([ True,  True,  True,  True], dtype=bool)
99
xnx
np.save('data.npy', num_arr) # save
new_num_arr = np.load('data.npy') # load
9
Sherzod

np.fromfile() a un argument de mot clé sep=:

Séparateur entre les éléments si le fichier est un fichier texte. Un séparateur vide (“”) signifie que le fichier doit être traité comme un fichier binaire. Les espaces (””) dans le séparateur correspondent à zéro ou plusieurs caractères blancs. Un séparateur composé uniquement d'espaces doit correspondre à au moins un espace.

La valeur par défaut de sep="" signifie que np.fromfile() essaie de le lire en tant que fichier binaire plutôt qu'en tant que fichier texte séparé par des espaces. Vous obtenez ainsi des valeurs sans signification. Si vous utilisez np.fromfile('markers.txt', sep=" "), vous obtiendrez le résultat recherché.

Cependant, comme d'autres l'ont déjà souligné, np.loadtxt() est le moyen préféré pour convertir des fichiers texte en tableaux numpy. À moins que le fichier ne soit lisible par l'homme, il est généralement préférable d'utiliser des formats binaires (par exemple, np.load()/np.save()).

3
ali_m