Як читати файли HDF5 у Python


80

Я намагаюся прочитати дані з файлу hdf5 на Python. Я можу прочитати файл hdf5 h5py, але не можу зрозуміти, як отримати доступ до даних у файлі.

Мій код

import h5py    
import numpy as np    
f1 = h5py.File(file_name,'r+')    

Це працює, і файл читається. Але як я можу отримати доступ до даних усередині файлового об'єкта f1?


1
Якщо файл містить модель Keras, ви, ймовірно, захочете завантажити його за допомогою Keras .
Джосія Йодер

Чи hdf5файл відрізняється від hdfфайлу? У мене є hdfs (це кілька смуг зображень), але я не можу зрозуміти, як їх відкрити.
mikey

Відповіді:


133

Прочитайте HDF5

import h5py
filename = "file.hdf5"

with h5py.File(filename, "r") as f:
    # List all groups
    print("Keys: %s" % f.keys())
    a_group_key = list(f.keys())[0]

    # Get the data
    data = list(f[a_group_key])

Напишіть HDF5

import h5py

# Create random data
import numpy as np
data_matrix = np.random.uniform(-1, 1, size=(10, 3))

# Write data to HDF5
with h5py.File("file.hdf5", "w") as data_file:
    data_file.create_dataset("group_name", data=data_matrix)

Докладнішу інформацію див. У документації h5py .

Альтернативи

Для вашої програми може бути важливим наступне:

  • Підтримка іншими мовами програмування
  • Виконання читання / письма
  • Компактність (розмір файлу)

Див. Також: Порівняння форматів серіалізації даних

Якщо ви скоріше шукаєте спосіб створити конфігураційні файли, ви можете прочитати мою коротку статтю Конфігураційні файли на Python


2
Щоб отримати дані у наборах даних HDF5 у вигляді масиву numpy, це можна зробитиf[key].value
erickrf

1
Станом на h5pyверсію 2.1: "Властивість Dataset.value, яка датується h5py 1.0, застаріла і буде видалена в наступному випуску. Ця властивість скидає весь набір даних у масив NumPy. Використання коду .valueслід оновити, щоб використовувати індексацію NumPy, використовуючи mydataset[...]або mydataset[()]в міру необхідності."
honey_badger

Я використовую бібліотеку hdf5 Джулії, і операція зчитування набагато швидша (включила б це як відповідь, але OP попросив python). Те саме читання файлу hdf5 у h5py займає вічно, однак у Джулії це дуже керовано, варто навчитися програмувати в Джулії саме для цієї однієї проблеми. Єдина проблема, яка виникала у мене з Джулією, полягала в тому, що вона неправильно обробляла рядки з нульовим завершенням, що для мене було трохи перешкодою.
demongolem 20.03.20

Коментуючи саму відповідь, операція зі списком у прочитаній версії призводить до зависання python. Якщо я просто роблю f [a_group_key], він працює з належною швидкістю.
demongolem

@demongolem: ви не повинні використовувати список усіх ключів, які ви вже знаєте, який із них хочете використовувати. Я зробив це тут, щоб мати автономний приклад, який вимагає найменшої роботи, щоб щось запустити.
Мартін Тома

21

Читання файлу

import h5py

f = h5py.File(file_name, mode)

Вивчення структури файлу шляхом друку наявних груп HDF5

for key in f.keys():
    print(key) #Names of the groups in HDF5 file.

Вилучення даних

#Get the HDF5 group
group = f[key]

#Checkout what keys are inside that group.
for key in group.keys():
    print(key)

data = group[some_key_inside_the_group].value
#Do whatever you want with data

#After you are done
f.close()

for key in data.keys(): print(key) #Names of the groups in HDF5 file.це можна замінити наlist(data)
Хітеш,

4
знати точну структуру з використанням усіх змінних:data.visit(print)
Хітеш,

просто fyi, f у h5py.File (...) слід писати з великих літер.
dannykim

1
@dannykim Готово.
Daksh

2
Важливо: data.close()потрібно в кінці.
anilbey

19

ви можете використовувати панди.

import pandas as pd
pd.read_hdf(filename,key)

4
Ви не повинні покладатися на реалізацію Pandas, якщо не зберігаєте фрейми даних. read_hdf покладається на те, що файл HDF має певну структуру; також немає pd.write_hdf, тому ви могли використовувати його лише в один бік. Дивіться цю публікацію .
Макс

2
Панди дійсно мають функцію письма. Див. Pd.DataFrame.to_hdf
Ерік Тау,

7

Ось проста функція, яку я щойно написав, яка зчитує файл .hdf5, згенерований функцією save_weights у керах, і повертає dict з іменами шарів та вагами:

def read_hdf5(path):

    weights = {}

    keys = []
    with h5py.File(path, 'r') as f: # open file
        f.visit(keys.append) # append all keys to list
        for key in keys:
            if ':' in key: # contains data if ':' in key
                print(f[key].name)
                weights[f[key].name] = f[key].value
    return weights

https://gist.github.com/Attila94/fb917e03b04035f3737cc8860d9e9f9b .

Не перевірив його ретельно, але робить роботу за мене.


Здається, ця функція відображає весь вміст у файлі .h5. Дякую.
minTwin 02

4

Щоб прочитати вміст файлу .hdf5 як масив, ви можете зробити щось наступне

> import numpy as np 
> myarray = np.fromfile('file.hdf5', dtype=float)
> print(myarray)

4

Використовуйте код нижче для зчитування та перетворення даних у масив numpy

import h5py
f1 = h5py.File('data_1.h5', 'r')
list(f1.keys())
X1 = f1['x']
y1=f1['y']
df1= np.array(X1.value)
dfy1= np.array(y1.value)
print (df1.shape)
print (dfy1.shape)

1
Не забудьте закрити файл, інакше файл може бути пошкоджений.
anilbey

Дякую. Це, мабуть, найкращий спосіб відкрити файл даних .hdf5.
Farzad Amirjavid

2
from keras.models import load_model 

h= load_model('FILE_NAME.h5')

1
Ось як ми завантажуємо збережену модель NN у Keras. Я думаю, що це питання є більш загальним і стосується Кераса.
Упул Бандара

1
Коли все, що у вас є - це молоток, все схоже на Цвях :-).
Упул Бандара

1

Що вам потрібно зробити, це створити набір даних. Якщо ви подивитесь на посібник з швидкого запуску, він покаже вам, що вам потрібно використовувати об’єкт файлу, щоб створити набір даних. Отже, f.create_datasetі тоді ви можете прочитати дані. Це пояснюється в документах .


0

Використовуючи шматочки відповідей з цього питання та останнього документа , я зміг витягти свої числові масиви за допомогою

import h5py
with h5py.File(filename, 'r') as h5f:
    h5x = h5f[list(h5f.keys())[0]]['x'][()]

Де 'x'просто координата X у моєму випадку.


0

Якщо ви назвали набори даних у файлі hdf, ви можете використовувати наступний код для читання та перетворення цих наборів даних у масиви numpy:

import h5py
file = h5py.File('filename.h5', 'r')

xdata = file.get('xdata')
xdata= np.array(xdata)

Якщо ваш файл знаходиться в іншому каталозі, ви можете додати шлях перед ним 'filename.h5'.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.