У меня есть код Python, выход которого представляет собой матрицу размером , чьи записи относятся к типу float
. Если я сохраню его с расширением .dat
, размер файла будет порядка 500 МБ. Я читал, что использование h5py
значительно уменьшает размер файла. Итак, допустим, у меня есть массив 2D numpy с именем A
. Как сохранить его в h5py файле?
Кроме того, как я могу прочитать один и тот же файл и поместить его в виде массива numpy в другом коде, так как мне нужно делать манипуляции с массивом?
Входные и выходные массивы numpy для h5py
Ответ 1
h5py предоставляет модель наборов данных и групп. Первый - это в основном массивы, а последние - как каталоги. Каждый из них назван. Вы должны посмотреть документацию по API и примерам:
http://docs.h5py.org/en/latest/quick.html
Простой пример, в котором вы создаете все данные заранее и просто хотите сохранить его в файле hdf5, будет выглядеть примерно так:
In [1]: import numpy as np
In [2]: import h5py
In [3]: a = np.random.random(size=(100,20))
In [4]: h5f = h5py.File('data.h5', 'w')
In [5]: h5f.create_dataset('dataset_1', data=a)
Out[5]: <HDF5 dataset "dataset_1": shape (100, 20), type "<f8">
In [6]: h5f.close()
Затем вы можете загрузить эти данные с помощью:
In [10]: h5f = h5py.File('data.h5','r')
In [11]: b = h5f['dataset_1'][:]
In [12]: h5f.close()
In [13]: np.allclose(a,b)
Out[13]: True
Определенно проверьте документы:
Запись в файл hdf5 зависит либо от h5py, либо от pytables (у каждого из них есть другой API-интерфейс python, который находится поверх спецификации файла hdf5). Вы также должны взглянуть на другие простые двоичные форматы, предоставляемые numpy изначально, такие как np.save
, np.savez
и т.д.:
Ответ 2
Более чистый способ открыть/закрыть файл и избежать утечек памяти:
Подготовлено:
import numpy as np
import h5py
data_to_write = np.random.random(size=(100,20)) # or some such
Запись:
with h5py.File('name-of-file.h5', 'w') as hf:
hf.create_dataset("name-of-dataset", data=data_to_write)
Читать:
with h5py.File('name-of-file.h5', 'r') as hf:
data = hf['name-of-dataset'][:]