Untuk jawaban singkat Anda harus menggunakan np.savedan np.load. Keuntungan dari ini adalah bahwa mereka dibuat oleh pengembang perpustakaan numpy dan mereka sudah berfungsi (ditambah kemungkinan sudah dioptimalkan dengan baik) misalnya
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)
Jawaban yang diperluas:
Pada akhirnya itu benar-benar tergantung pada kebutuhan Anda karena Anda juga dapat menyimpannya dalam format yang dapat dibaca manusia (lihat Dump a NumPy array ke dalam file csv ) atau bahkan dengan pustaka lain jika file Anda sangat besar (lihat cara terbaik ini untuk mempertahankan array numpy pada disk untuk diskusi yang lebih luas).
Namun, (membuat perluasan karena Anda menggunakan kata "dengan benar" dalam pertanyaan Anda) Saya masih berpikir menggunakan fungsi numpy di luar kotak (dan sebagian besar kode!) Kemungkinan besar memenuhi sebagian besar kebutuhan pengguna. Alasan terpenting adalah itu sudah berfungsi . Mencoba menggunakan sesuatu yang lain untuk alasan lain mungkin membawa Anda pada lubang kelinci PANJANG yang tidak terduga untuk mencari tahu mengapa itu tidak berhasil dan memaksanya bekerja.
Ambil contoh mencoba menyimpannya dengan acar. Saya mencobanya hanya untuk bersenang-senang dan butuh setidaknya 30 menit untuk menyadari bahwa acar tidak akan menyimpan barang-barang saya kecuali saya membuka & membaca file dalam mode byte dengan wb. Butuh waktu untuk google, mencoba sesuatu, memahami pesan kesalahan dll .. Detail kecil tetapi fakta bahwa itu sudah mengharuskan saya untuk membuka file hal-hal rumit dengan cara yang tidak terduga. Untuk menambahkan bahwa saya harus membaca ulang ini (btw yang agak membingungkan) Perbedaan antara mode a, a +, w, w +, dan r + dalam fungsi terbuka built-in? .
Jadi jika ada antarmuka yang memenuhi kebutuhan Anda, gunakan kecuali Anda memiliki alasan ( sangat ) bagus (misalnya kompatibilitas dengan matlab atau karena alasan tertentu Anda sangat ingin membaca file dan mencetak dengan python benar-benar tidak memenuhi kebutuhan Anda, yang mana mungkin dipertanyakan). Selain itu, kemungkinan besar jika Anda perlu mengoptimalkannya, Anda akan mengetahuinya nanti (daripada menghabiskan waktu lama untuk men-debug hal-hal yang tidak berguna seperti membuka file numpy sederhana).
Jadi gunakan antarmuka / numpy sediakan . Mungkin tidak sempurna, kemungkinan besar baik-baik saja, terutama untuk perpustakaan yang sudah ada selama numpy.
Saya sudah menghabiskan waktu menyimpan dan memuat data dengan numpy dalam banyak cara jadi bersenang-senanglah dengannya, semoga membantu!
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')
Beberapa komentar tentang apa yang saya pelajari:
np.saveseperti yang diharapkan, ini sudah memampatkannya dengan baik (lihat https://stackoverflow.com/a/55750128/1601580 ), berfungsi di luar kotak tanpa membuka file apa pun. Bersih. Mudah. Efisien. Gunakan.
np.savezmenggunakan format tidak terkompresi (lihat docs ) Save several arrays into a single file in uncompressed .npz format.Jika Anda memutuskan untuk menggunakan ini (Anda diperingatkan untuk keluar dari solusi standar jadi harapkan bug!) Anda mungkin menemukan bahwa Anda perlu menggunakan nama argumen untuk menyimpannya, kecuali Anda ingin gunakan nama default. Jadi jangan gunakan ini jika yang pertama sudah berfungsi (atau karya apa pun menggunakan itu!)
- Pickle juga memungkinkan eksekusi kode arbitrer. Beberapa orang mungkin tidak ingin menggunakan ini untuk alasan keamanan.
- file yang dapat dibaca manusia mahal untuk dibuat, dll. Mungkin tidak sepadan.
- ada sesuatu yang disebut
hdf5file besar. Keren! https://stackoverflow.com/a/9619713/1601580
Perhatikan bahwa ini bukanlah jawaban yang lengkap. Tetapi untuk sumber daya lain periksa ini: