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:
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 ...
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.
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)
np.save('data.npy', num_arr) # save
new_num_arr = np.load('data.npy') # load
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()
).