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

101

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

скорость любви
источник
4
Как с .datрасширением сохраняете ?
jorgeca 05
@jorgeca: для этого я просто делаюnp.savetxt("output.dat",A,'%10.8e')
lovespeed
3
Спасибо (само по себе расширение ничего не значит, его можно хранить как двоичный, ascii ...). Если вам не нужны дополнительные функции hdf5, я бы просто использовал, np.save('output.dat', A)который сохранит его в двоичном формате (намного быстрее, гораздо меньше места используется).
jorgeca 05
@jorgeca, но сможет ли другой скрипт python прочитать его как 2D-массив, когда я назову его такA = np.loadtxt('output.dat',unpack=True)
lovespeed
2
так h5pyне создает файлы меньше, чем те np.save? это h5pyбыстрее , чем np.saveдля массивов размера данного в вопросе?
dbliss

Ответы:

133

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

ДжошАдель
источник
Кстати. если вы не знаете заранее имя набора данных при чтении, вам необходимо проанализировать файл hdf, как здесь .
Триларион
@JoshAdel, если я хочу добавить столбец в набор данных. мой набор данных - это многомерный массив np.array, индексированный как [img_id, rows, colums, channels]. и я сохранил его, используя метод, описанный в вашем ответе. Я получаю доступ ко всем точкам в наборе данных, используя h5f ['dataset_1'] [img_id]. то, что я хочу, - это способ добавить еще один столбец, скажем "mycolumn" ... соответствующий каждому img_id в наборе данных. как мне добавить к этому еще один столбец, чтобы я мог делать h5f ['mycolumn'] [img_id]?
iratzhash 06
Если я напишу такие матрицы, я не смогу их увидеть с помощью HDFView 2.11 - я могу открыть файл, я вижу, что набор данных data.h5существует, но я не могу просмотреть его с помощью HDFView. Я могу читать содержимое с помощью h5py, но не проверять его с помощью HDFView. Есть идеи, почему?
Мартин Тома
105

Более чистый способ обработки открытия / закрытия файлов и предотвращения утечек памяти:

Подготовка:

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'][:]
Лави Авигдор
источник
2
Не нужно закрывать файл?
ricoamor
23
@DrDeSancho нет, оператор with
Леонид
1
особенно полезно при работе в интерактивном режиме (потому что в противном случае есть риск получить исключение от h5py об уже открытом файле, когда один и тот же код повторно запускается без надлежащего закрытия с первой попытки)
Андре Хольцнер
withОсобенность Python известна как менеджер контекста. Он гарантирует, что файл будет закрыт после того, как он был использован. Дополнительная информация доступна в официальной документации: docs.python.org/3/library/contextlib.html
Отметьте