Входные и выходные массивы numpy для h5py

У меня есть код Python, выход которого представляет собой матрицу размером enter image description here, чьи записи относятся к типу float. Если я сохраню его с расширением .dat, размер файла будет порядка 500 МБ. Я читал, что использование h5py значительно уменьшает размер файла. Итак, допустим, у меня есть массив 2D numpy с именем A. Как сохранить его в h5py файле? Кроме того, как я могу прочитать один и тот же файл и поместить его в виде массива numpy в другом коде, так как мне нужно делать манипуляции с массивом?

Ответ 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

Определенно проверьте документы:

http://docs.h5py.org

Запись в файл hdf5 зависит либо от h5py, либо от pytables (у каждого из них есть другой API-интерфейс python, который находится поверх спецификации файла hdf5). Вы также должны взглянуть на другие простые двоичные форматы, предоставляемые numpy изначально, такие как np.save, np.savez и т.д.:

http://docs.scipy.org/doc/numpy/reference/routines.io.html

Ответ 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'][:]