Для короткої відповіді слід використовувати np.save
і np.load
. Переваги їх у тому, що вони створені розробниками бібліотеки numpy і вони вже працюють (плюс, ймовірно, вже добре оптимізовані), напр.
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]]
Розгорнута відповідь:
Врешті-решт це насправді залежить від ваших потреб, оскільки ви також можете зберегти його у зручному для читання форматі (див. Дану передачу масиву NumPy у файл CSV ) або навіть у інші бібліотеки, якщо ваші файли надзвичайно великі (див. Цей найкращий спосіб збереження масивів Numpy на диску для розширеного обговорення).
Однак (зробивши розширення, оскільки ви використовуєте слово "правильно" у своєму запитанні), я все ще думаю, що використання функції numpy нестандартно (і більшість коду!), Швидше за все, задовольняє більшість потреб користувачів. Найголовніша причина - це вже працює . Спроба використати щось інше з будь-якої іншої причини може призвести вас до несподівано ДОЛГОЇ кролячої нори, щоб зрозуміти, чому це не працює, і змусити її працювати.
Візьмемо для прикладу спробу зберегти його за допомогою соління. Я спробував це просто для розваги, і мені знадобилося принаймні 30 хвилин, щоб зрозуміти, що соління не збереже мої речі, якщо я не відкрию та не прочитаю файл у байтовому режимі wb
. Потрапив час на гугл, спробувати щось, зрозуміти повідомлення про помилку тощо ... Невеликі деталі, але той факт, що це вже вимагало від мене відкриття файлу, ускладнило речі несподіваними способами. Додамо, що мені потрібно було перечитати цю (що, до речі, щось заплутане) Різниця між режимами a, a +, w, w + і r + у вбудованій відкритій функції? .
Отже, якщо є інтерфейс, який відповідає вашим потребам, використовуйте його, якщо у вас немає ( дуже ) вагомих причин (наприклад, сумісність з matlab або з якихось причин ви дійсно хочете прочитати файл, а друк на python насправді не відповідає вашим потребам, що може бути сумнівним). Крім того, швидше за все, якщо вам потрібно її оптимізувати, ви дізнаєтесь це пізніше (а не витрачати віки на налагодження марних речей, таких як відкриття простого файлу numpy).
Тому використовуйте інтерфейс / numpy . Це може бути не ідеально, це, швидше за все, добре, особливо для бібліотеки, яка існувала стільки ж, скільки numpy.
Я вже багато часу витрачав на збереження та завантаження даних за допомогою numpy, тому отримуйте від цього задоволення, сподіваюся, це допоможе!
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')
Кілька коментарів до того, що я дізнався:
np.save
як і слід було очікувати, це вже добре стискає (див. https://stackoverflow.com/a/55750128/1601580 ), працює нестандартно, без будь-якого відкриття файлу. Чистий. Легко. Ефективний. Використай це.
np.savez
використовує нестиснутий формат (див. документи ) Save several arrays into a single file in uncompressed
.npz format.
Якщо ви вирішите використовувати це (вас попередили відмовитися від стандартного рішення, тож очікуйте помилок!), можливо, вам доведеться використовувати для збереження імена аргументів, якщо ви не хочете використовувати імена за замовчуванням. Тому не використовуйте це, якщо перша вже працює (або будь-яка робота використовує це!)
- Pickle також дозволяє довільне виконання коду. Деякі люди можуть не захотіти використовувати це з міркувань безпеки.
- зручні для читання файли тощо. Напевно, не варто.
- є щось, що називається
hdf5
великими файлами. Класно! https://stackoverflow.com/a/9619713/1601580
Зауважте, що це не вичерпна відповідь. Але щодо інших ресурсів перевірте це: