Aby uzyskać krótką odpowiedź, użyj np.save
i np.load
. Zaletą tego jest to, że są one tworzone przez programistów biblioteki numpy i już działają (plus prawdopodobnie są już ładnie zoptymalizowane) np.
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)
print(x == x_loaded)
Rozszerzona odpowiedź:
Ostatecznie zależy to od twoich potrzeb ponieważ możesz również zapisać to w formacie czytelnym dla człowieka (zobacz ten Zrzuć tablicę NumPy do pliku csv ) lub nawet z innymi bibliotekamijeśli twoje pliki są bardzo duże (zobacz ten najlepszy sposób na zachowanie tablic numpy na dysku dla rozszerzonej dyskusji).
Jednak (robiąc rozwinięcie, ponieważ w swoim pytaniu użyłeś słowa „prawidłowo”) nadal uważam, że używanie funkcji numpy po wyjęciu z pudełka (i większości kodu!) Najprawdopodobniej zaspokoi większość potrzeb użytkowników. Najważniejszym powodem jest to, że już działa . Próba użycia czegoś innego z jakiegokolwiek innego powodu może doprowadzić cię do nieoczekiwanie DŁUGIEJ króliczej nory, aby dowiedzieć się, dlaczego to nie działa, i zmusić to.
Weźmy na przykład próbę uratowania go marynatą. Próbowałem tego tylko dla zabawy i zajęło mi co najmniej 30 minut, zanim zdałem sobie sprawę, że marynata nie zapisałaby moich rzeczy, chyba że otworzę i przeczytam plik w trybie bajtów za pomocą wb
. Zajęło trochę czasu, żeby wygooglować, spróbować, zrozumieć komunikat o błędzie itp. Drobny szczegół, ale fakt, że już wymagało to ode mnie otwarcia pliku, skomplikował sprawę w nieoczekiwany sposób. Aby dodać, że wymagało to ponownego przeczytania (co przy okazji jest trochę zagmatwane) Różnica między trybami a, a +, w, w + i r + we wbudowanej funkcji open? .
Więc jeśli istnieje interfejs, który spełnia twoje potrzeby, użyj go, chyba że masz ( bardzo ) dobry powód (np. Zgodność z matlabem lub z jakiegoś powodu naprawdę chcesz odczytać plik, a drukowanie w Pythonie naprawdę nie spełnia twoich potrzeb), może budzić wątpliwości). Co więcej, najprawdopodobniej, jeśli chcesz go zoptymalizować, dowiesz się później (zamiast spędzać lata na debugowaniu bezużytecznych rzeczy, takich jak otwieranie prostego pliku numpy).
Więc użyj interfejsu / numpy dostarcza . To może nie być idealne, najprawdopodobniej w porządku, szczególnie w przypadku biblioteki, która istnieje tak długo, jak odrętwienie.
Spędziłem już sporo czasu na zapisywaniu i ładowaniu danych z numpy, więc baw się dobrze, mam nadzieję, że to pomoże!
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
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)
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')
Kilka komentarzy na temat tego, czego się nauczyłem:
np.save
zgodnie z oczekiwaniami, to już dobrze kompresuje (patrz https://stackoverflow.com/a/55750128/1601580 ), działa po wyjęciu z pudełka bez otwierania pliku. Czysty. Łatwy. Wydajny. Użyj tego.
np.savez
używa nieskompresowanego formatu (patrz dokumentacja ) Save several arrays into a single file in uncompressed
.npz format.
Jeśli zdecydujesz się użyć tego (ostrzeżono Cię, aby odejść od standardowego rozwiązania, więc spodziewaj się błędów!), możesz odkryć, że musisz użyć nazw argumentów, aby go zapisać, chyba że chcesz użyj nazw domyślnych. Więc nie używaj tego, jeśli pierwsza już działa (lub jakieś prace używają tego!)
- Pickle pozwala również na wykonanie dowolnego kodu. Niektórzy ludzie mogą nie chcieć tego używać ze względów bezpieczeństwa.
- pliki czytelne dla ludzi są drogie w wykonaniu itp. Prawdopodobnie nie warto.
- jest coś, co wymaga
hdf5
dużych plików. Fajne! https://stackoverflow.com/a/9619713/1601580
Zauważ, że to nie jest wyczerpująca odpowiedź. Ale w przypadku innych zasobów sprawdź to: