2015-02-10 18 views
11

Mi chiedo, come salvare e caricare correttamente i dati numpy.array. Attualmente sto usando il metodo numpy.savetxt(). Per esempio, se ho ottenuto un allineamento markers, che assomiglia a questo:Come salvare e caricare correttamente i dati di numpy.array()?

enter image description here

provo a salvarla con l'uso di:

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

In altro script provo ad aprire precedentemente salvato File:

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

Ed è quello che ho ...

enter image description here

dati salvati primo aspetto:

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 

Ma quando salvo appena caricati i dati con l'uso dello stesso metodo, vale a dire. numpy.savetxt() sembra che questo:

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 

Che cosa sto facendo di sbagliato? PS non ci sono altre operazioni "dietro le quinte" che eseguo. Basta salvare e caricare, ed è quello che ottengo. Grazie in anticipo.

+0

Qual è l'output del file di testo? Perché non scrivere semplicemente in un file CSV? –

+1

Hai bisogno di salvare e caricare file di testo leggibili? Sarà più veloce (e i file saranno più compatti) se salvi/carichi file binari usando 'np.save()' e 'np.load()'. –

+0

Grazie per il vostro consiglio. Ha aiutato. Tuttavia, puoi spiegare perché è quello che è e se esiste un modo per consentire il salvataggio dei dati nel formato * .txt e caricarlo senza mal di testa? Ad esempio, quando si vuole lavorare con matlab, java o altri strumenti/linguaggi. – bluevoxel

risposta

29

Il modo più affidabile che ho trovato per farlo è quello di utilizzare np.savetxt con np.loadtxt e non np.fromfile che è più adatto per i file binari scritti con tofile. I metodi np.fromfile e np.tofile scrivono e leggono file binari mentre np.savetxt scrive un file di testo. Così, per esempio:

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) 

Oppure:

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) 

Io uso il metodo precedente, anche se è più lento e crea file più grandi (a volte): il formato binario può essere dipendente dalla piattaforma (ad esempio , il formato del file dipende dalla endianness del tuo sistema).

C'è un formato indipendente piattaforma per gli array NumPy, che può essere salvato e letta con np.save e 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) 
+6

I file '.npy' (ad esempio generati da' np.save() ') * sono * indipendenti dalla piattaforma e saranno più compatti e più veloci da creare rispetto ai file di testo. –

+0

Grazie, ho dimenticato di dirlo. Modificato. – xnx

1

np.fromfile() ha un argomento sep= parola chiave:

separatore tra gli elementi se il file è un file di testo. Il separatore vuoto ("") significa che il file deve essere trattato come binario. Gli spazi ("") nel separatore corrispondono a zero o più caratteri di spazi bianchi. Un separatore composto solo da spazi deve corrispondere ad almeno uno spazio bianco.

Il valore predefinito di sep="" significa che np.fromfile() cerca di leggerlo come un file binario, piuttosto che un file di testo separati da spazi, in modo da ottenere i valori senza senso indietro. Se usi np.fromfile('markers.txt', sep=" ") otterrai il risultato che stai cercando.

Tuttavia, come altri hanno fatto notare, np.loadtxt() è il modo migliore per convertire i file di testo per gli array NumPy, e meno che il file deve essere leggibile di solito è meglio usare formati binari, invece (ad esempio np.load()/np.save()) .

Problemi correlati