簡體   English   中英

如何在 HDF5 數據集中存儲字典

[英]How to store dictionary in HDF5 dataset

我有一本字典,其中鍵是日期時間對象,值是整數元組:

>>> d.items()[0]
(datetime.datetime(2012, 4, 5, 23, 30), (14, 1014, 6, 3, 0))

我想將它存儲在 HDF5 數據集中,但如果我嘗試只轉儲字典 h5py 會引發錯誤:

TypeError: Object dtype dtype('object') has no native HDF5 equivalent

轉換此字典以便我可以將其存儲在 HDF5 數據集中的“最佳”方法是什么?

具體來說,我不想只是將字典轉儲到 numpy 數組中,因為它會使基於日期時間查詢的數據檢索復雜化。

我找到了兩種方法:

I)將日期時間對象轉換為字符串並將其用作數據集名稱

h = h5py.File('myfile.hdf5')
for k, v in d.items():
    h.create_dataset(k.strftime('%Y-%m-%dT%H:%M:%SZ'), data=np.array(v, dtype=np.int8))

可以通過查詢鍵字符串(數據集名稱)來訪問數據。 例如:

for ds in h.keys():
    if '2012-04' in ds:
        print(h[ds].value)

II)將日期時間對象轉換為數據集子組

h = h5py.File('myfile.hdf5')
for k, v in d.items():
    h.create_dataset(k.strftime('%Y/%m/%d/%H:%M'), data=np.array(v, dtype=np.int8))

注意 strftime 字符串中的正斜杠,這將在 HDF 文件中創建適當的子組。 可以像h['2012']['04']['05']['23:30'].value一樣直接訪問數據,或者通過使用提供的 h5py 迭代器進行迭代,甚至通過visititems()使用自定義函數

為簡單起見,我選擇第一個選項。

這個問題涉及到能夠以HDF5格式存儲任何類型的字典的更普遍的問題。 首先,將字典轉換為字符串。 然后要恢復字典,請使用import ast命令使用ast庫。 下面的代碼給出了一個例子。

>>> d = {1:"a",2:"b"}
>>> s = str(d)
>>> s
"{1: 'a', 2: 'b'}"
>>> ast.literal_eval(s)
{1: 'a', 2: 'b'}
>>> type(ast.literal_eval(s))
<type 'dict'>

我會將對象序列化為 JSON 或 YAML,並將結果字符串作為屬性存儲在適當的對象(HDF5 組或數據集)中。

但是,我不確定您為什么使用日期時間作為數據集名稱,除非您絕對需要按日期時間直接查找數據集。

ps 就其價值而言, PyTables 比低級 h5py 更容易使用

現在我們有 deepdish (www.deepdish.io):

import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))

以前的答案旨在將 Python 字典存儲為 hdf5 數據集。 以下代碼可用於將 Python 字典存儲為 hdf5 屬性(元數據),這是更合乎邏輯的方法:

import h5py
import numpy as np

#Writing data
d1 = np.random.random(size = (1000,20))  #sample data
hf = h5py.File('test_data.h5', 'w')
dset1=hf.create_dataset('dataset_1', data=d1)
#set some metadata directly
hf.attrs['metadata1']=5

#sample dictionary object
sample_dict={"metadata2":1, "metadata3":2, "metadata4":"blah_blah"}

#Store this dictionary object as hdf5 metadata
for k in sample_dict.keys():
    hf.attrs[k]=sample_dict[k]

hf.close()

#Reading data
hf1 = h5py.File('test_data.h5', 'r')
for name in hf1:
    print(name)

print(hf1.attrs.keys())
hf1.close()

這給出了一個輸出

dataset_1
<KeysViewHDF5 ['metadata1', 'metadata2', 'metadata3', 'metadata4']>

這意味着作為屬性直接分配的 metadata1 和從字典對象中獲得的 metadata2、3、4 同時存儲為屬性。

另一種選擇是使用hdf5組功能。 關於組的 h5py 文檔

示例代碼:

dictionary保存到h5

dict_test = {'a': np.ones((100,100)), 'b': np.zeros((100,100))}
hf = h5py.File('dict_data.h5', 'w')
dict_group = hf.create_group('dict_data')
for k, v in dict_test.items():
    dict_group[k] = v
hf.close()

然后將數據加載回dictionary

dict_new = {}
file = h5py.File('dict_data.h5', 'r')
dict_group_load = file['dict_data']
dict_group_keys = dict_group_load.keys()
for k in dict_group_keys:
    dict_new[k]= dict_group_load[k][:]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM