Для краткого ответа используйте 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)
print(x == x_loaded)
Расширенный ответ:
В конце концов, это действительно зависит от ваших потребностей, потому что вы также можете сохранить его в удобочитаемом формате (см. Дамп массива NumPy в файл csv ) или даже с другими библиотеками, если ваши файлы очень большие (см. Этот лучший способ сохранить массивы numpy на диске для расширенного обсуждения).
Однако (делая расширение, поскольку вы используете слово «правильно» в своем вопросе) я все еще думаю, что использование функции numpy из коробки (и большей части кода!), Скорее всего, удовлетворит большинство потребностей пользователей. Самая главная причина в том, что это уже работает . Попытка использовать что-то еще по любой другой причине может привести вас к неожиданно ДЛИННОЙ кроличьей норе, чтобы выяснить, почему это не работает, и заставить его работать.
Возьмем, к примеру, попытку спасти рассолом. Я попробовал это просто для удовольствия, и мне потребовалось не менее 30 минут, чтобы понять, что pickle не спасет мои вещи, если я не открою и не прочитаю файл в байтовом режиме с помощью 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
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')
Некоторые комментарии к тому, что я узнал:
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
Обратите внимание, что это не исчерпывающий ответ. Но для других ресурсов проверьте это: