Как читать файлы HDF5 в Python
Я пытаюсь прочитать данные из файла hdf5 в Python. Я могу прочитать файл hdf5, используя h5py
, но я не могу понять, как получить доступ к данным в файле.
Мой код
import h5py
import numpy as np
f1 = h5py.File(file_name,'r+')
Это работает, и файл читается. Но как я могу получить доступ к данным внутри файлового объекта f1
?
13 ответов
Читать HDF5
import h5py
filename = 'file.hdf5'
f = h5py.File(filename, 'r')
# 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
#!/usr/bin/env python
import h5py
# Create random data
import numpy as np
data_matrix = np.random.uniform(-1, 1, size=(10, 3))
# Write data to HDF5
data_file = h5py.File('file.hdf5', 'w')
data_file.create_dataset('group_name', data=data_matrix)
data_file.close()
Смотрите h5py документы для получения дополнительной информации.
альтернативы
- JSON: Отлично подходит для написания удобочитаемых данных; ОЧЕНЬ широко используется ( чтение и запись)
- CSV: супер простой формат ( чтение и запись)
- pickle: формат сериализации Python ( чтение и запись)
- MessagePack ( пакет Python): более компактное представление ( чтение и запись)
- HDF5 ( пакет Python): отлично подходит для матриц ( чтение и запись)
- XML: существует тоже * вздох * ( чтение и запись)
Для вашего приложения может быть важно следующее:
- Поддержка другими языками программирования
- Чтение / запись производительности
- Компактность (размер файла)
Смотрите также: Сравнение форматов сериализации данных
Если вы предпочитаете создавать конфигурационные файлы, вы можете прочитать мою короткую статью Конфигурационные файлы в Python
Чтение файла
import h5py
data = h5py.File(file_name, mode)
Изучите структуру файла, напечатав, какие группы HDF5 присутствуют
for key in data.keys():
print(key) #Names of the groups in HDF5 file.
Извлечение данных
#Get the HDF5 group
group = data[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
data.close()
Вы можете использовать панд.
import pandas as pd
pd.read_hdf(filename,key)
Вот простая функция, которую я только что написал, которая читает файл.hdf5, сгенерированный функцией save_weights в keras, и возвращает 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.
Не проверил это полностью, но сделал работу для меня.
Чтобы прочитать содержимое файла.hdf5 в виде массива, вы можете сделать следующее:
> import numpy as np
> myarray = np.fromfile('file.hdf5', dtype=float)
> print(myarray)
Используйте приведенный ниже код для чтения данных и преобразования их в массив
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)
Если вы назвали наборы данных в файле hdf, вы можете использовать следующий код для чтения и преобразования этих наборов данных в массивы numpy:
import h5py
file = h5py.File('filename.h5', 'r')
xdata = file.get('xdata')
xdata= np.array(xdata)
Если ваш файл находится в другом каталоге, вы можете добавить путь перед'filename.h5'
.
from keras.models import load_model
h= load_model('FILE_NAME.h5')
Что вам нужно сделать, это создать набор данных. Если вы посмотрите руководство по быстрому запуску, оно покажет вам, что вам нужно использовать объект файла для создания набора данных. Так, f.create_dataset
и тогда вы можете прочитать данные. Это объясняется в документах.
Чтение
Использоватьvisititems
функция отh5py
. Функция обратного вызова вызывается по всей иерархии: группам и наборам данных.
import h5py
# Open the HDF5 file in read mode
file_path = 'your_file.h5'
with h5py.File(file_path, 'r') as file:
# Function to recursively print the HDF5 dataset hierarchy
def print_hdf5_item(name, obj):
# name is in path format like /group1/group2/dataset
if isinstance(obj, h5py.Group):
# Do something like creating a dictionary entry
print(f'Group: {name}')
elif isinstance(obj, h5py.Dataset):
# Do something with obj like converting to a pandas.Series
# and storing to a dictionary entry
print(f'Dataset: {name}')
# Visit all items in the HDF5 file and print their names
file.visititems(print_hdf5_item)
или используйтеpandas.read_hdf
:
import pandas as pd
df = pd.read_hdf('./store.h5')
Обратите внимание, что ваши данные могут не сопоставляться напрямую с DataFrame. Первый вариант более гибкий.
Письмо
Если вы используете Pandas , вы можете использоватьpandas.DataFrame.to_hdf
:
# df is a DataFrame object
df.to_hdf('database.h5', 'group/subgroup', table=True, mode='a')
Я рекомендую обертку h5py,, что позволяет легко загружать данные hdf5 с помощью таких атрибутов, какgroup.dataset
(эквивалент оригиналаgroup['dataset']
) с завершением вкладки IPython/Jupyter.
Код H5Attr
здесь. Вот несколько примеров использования. Вы можете попробовать приведенный ниже код самостоятельно.
# create example HDF5 file for this guide
import h5py, io
file = io.BytesIO()
with h5py.File(file, 'w') as fp:
fp['0'] = [1, 2]
fp['a'] = [3, 4]
fp['b/c'] = 5
fp.attrs['d'] = 's'
# import package
from h5attr import H5Attr
# open file
f = H5Attr(file)
# easy access to members, with tab completion in IPython/Jupyter
f.a, f['a']
# also work for subgroups, but note that f['b/c'] is more efficient
# because it does not create f['b']
f.b.c, f['b'].c, f['b/c']
# access to HDF5 attrs via a H5Attr wrapper
f._attrs.d, f._attrs['d']
# show summary of the data
f._show()
# 0 int64 (2,)
# a int64 (2,)
# b/ 1 members
# lazy (default) and non-lazy mode
f = H5Attr(file)
f.a # <HDF5 dataset "a": shape (2,), type "<i8">
f = H5Attr(file, lazy=False)
f.a # array([3, 4])
Используя кусочки ответов из этого вопроса и последний документ, я смог извлечь свои числовые массивы, используя
import h5py
with h5py.File(filename, 'r') as h5f:
h5x = h5f[list(h5f.keys())[0]]['x'][()]
куда 'x'
это просто координата X в моем случае.
используйте это, это отлично работает для меня
weights = {}
keys = []
with h5py.File("path.h5", 'r') as f:
f.visit(keys.append)
for key in keys:
if ':' in key:
print(f[key].name)
weights[f[key].name] = f[key][()]
return weights
print(read_hdf5())
если вы используете h5py<='2.9.0', вы можете использовать
weights = {}
keys = []
with h5py.File("path.h5", 'r') as f:
f.visit(keys.append)
for key in keys:
if ':' in key:
print(f[key].name)
weights[f[key].name] = f[key].value
return weights
print(read_hdf5())