Per una risposta breve dovresti usare np.save
e np.load
. Il vantaggio di questi è che sono realizzati dagli sviluppatori della libreria numpy e funzionano già (inoltre sono probabilmente già ottimizzati bene) ad es.
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]]
Risposta estesa:
Alla fine dipende davvero dalle tue esigenze perché puoi anche salvarlo in formato leggibile dall'uomo (vedi questo Scaricare un array NumPy in un file csv ) o anche con altre librerie se i tuoi file sono estremamente grandi (vedi questo modo migliore per preservare gli array numpy su disco per una discussione estesa).
Tuttavia, (facendo un'espansione poiché usi la parola "correttamente" nella tua domanda) penso ancora che l'uso della funzione numpy fuori dagli schemi (e la maggior parte del codice!) Molto probabilmente soddisfi la maggior parte delle esigenze degli utenti. Il motivo più importante è che funziona già . Cercare di usare qualcos'altro per qualsiasi altro motivo potrebbe portarti in una tana di coniglio inaspettatamente LUNGA per capire perché non funziona e costringerlo a funzionare.
Prendiamo ad esempio il tentativo di salvarlo con pickle. L'ho provato solo per divertimento e mi ci sono voluti almeno 30 minuti per rendermi conto che pickle non avrebbe salvato le mie cose a meno che non avessi aperto e letto il file in modalità byte con wb
. Mi ci è voluto del tempo per google, provare, capire il messaggio di errore ecc ... Piccolo dettaglio ma il fatto che già mi richiedesse di aprire un file ha complicato le cose in modi inaspettati. Per aggiungere che mi ha richiesto di rileggere questo (che btw è un po 'confuso) Differenza tra le modalità a, a +, w, w + e r + nella funzione di apertura incorporata? .
Quindi, se esiste un'interfaccia che soddisfa le tue esigenze, usala a meno che tu non abbia una ( molto ) buona ragione (es. Compatibilità con matlab o per qualche motivo vuoi davvero leggere il file e stampare in python non soddisfa le tue esigenze, il che potrebbe essere discutibile). Inoltre, molto probabilmente se hai bisogno di ottimizzarlo lo scoprirai in seguito (piuttosto che passare anni a eseguire il debug di cose inutili come l'apertura di un semplice file numpy).
Quindi usa l'interfaccia / numpy fornisce . Potrebbe non essere perfetto, molto probabilmente va bene, specialmente per una libreria che esiste da quando è numpy.
Ho già speso il salvataggio e il caricamento dei dati con numpy in un sacco di modi quindi divertiti con esso, spero che aiuti!
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')
Alcuni commenti su ciò che ho imparato:
np.save
come previsto, questo già lo comprime bene (vedere https://stackoverflow.com/a/55750128/1601580 ), funziona immediatamente senza alcuna apertura di file. Pulito. Facile. Efficiente. Usalo.
np.savez
usa un formato non compresso (vedi documenti ) Save several arrays into a single file in uncompressed
.npz format.
Se decidi di usarlo (sei stato avvertito di abbandonare la soluzione standard quindi aspettati bug!) potresti scoprire che devi usare nomi di argomenti per salvarlo, a meno che tu non lo voglia utilizzare i nomi predefiniti. Quindi non usarlo se il primo funziona già (o qualsiasi lavoro lo usa!)
- Pickle consente anche l'esecuzione di codice arbitrario. Alcune persone potrebbero non volerlo utilizzare per motivi di sicurezza.
- i file leggibili dall'uomo sono costosi da creare, ecc. Probabilmente non ne vale la pena.
- c'è qualcosa chiamato
hdf5
per file di grandi dimensioni. Freddo! https://stackoverflow.com/a/9619713/1601580
Nota che questa non è una risposta esaustiva. Ma per altre risorse controlla questo: