python-3.x 如何将HDF5数据集写入字典矩阵

nfs0ujit  于 2023-03-04  发布在  Python
关注(0)|答案(1)|浏览(130)

我正在编写一个小脚本,将HDF5文件中的数据写入矩阵中,以便进一步分析。
该文件的结构如下所示:这个文件由几个组组成,这些组的名称与下面代码中的groupname_template一致(例如'0,0','0,1'等)。2每个组内部至少有一个数据集。
我想创建一个字典矩阵,其中的每个元素都是一个字典,由数据集名称和对应的数据组成。
下面是我编写的代码:

import numpy as np
import h5py
import re

loaddir = r'C:\Users\User\Documents\data reading test\test_datafile.hdf5'
matrix_dict = np.full((10,10), {})
groupname_template = re.compile('\d+, \d+')

with h5py.File(loaddir, 'r') as loadedfile:
    for group in loadedfile.keys():
        if bool(re.match(groupname_template, group)):
            for key, value in loadedfile[group].items():
                matrix_dict[eval(group)[0], eval(group)[1]][key] = value[:]

然而,当我尝试将字典写入矩阵单元格时,它也会被复制到之前填充的所有单元格中,这会导致矩阵只包含最后一组的数据集。
我尝试了不同的语法和方法,但问题仍然存在。
所以我愿意接受任何关于是什么导致了数据集的这种奇怪的传播的建议。

hmae6n7t

hmae6n7t1#

问题在于将数据集名称/值对加载到matrix_dict的方式,您必须创建一个字典来保存每个组的所有数据集名称/值对,然后将其分配给matrix_dict中适当的(i,j)索引。
我修改了你的代码来演示我认为你希望它如何工作。它使用了我创建的一个简单的HDF 5示例文件(每个文件有4个组/ 3个数据集)。该文件的代码在最后。
下面是我的例子的注解。

  • 我将matrix_dict的名称改为arr_of_dict B/c它是一个NumPy数组。我这样做是为了清楚b/c数组和矩阵是不同的对象类型。您正在创建一个数组。矩阵是用np.matrix()创建的专用二维“类似数组”的对象。NumPy np.matrix()文档说:“* 不再建议使用此类 *"。
  • 我创建了arr_dict,将每个组中的数据集名称/值对加载到一个字典中,并在循环后将其分配给组(i,j)索引。
  • 我将group.items()生成的变量名从key,value更改为ds_name, ds_obj,以提高可读性(并强调它们是数据集名称和H5对象)。
    检索组/数据集并加载到字典的np.数组中的代码:
with h5py.File(loaddir, 'r') as loadedfile:
    for group in loadedfile.keys():
        print(f'working on group: {group}')
        if bool(re.match(groupname_template, group)):
            print(f'reading datasets in group: {group}')
            arr_dict = {}
            for ds_name, ds_obj in loadedfile[group].items():
                arr_dict[ds_name] = ds_obj[:]
            arr_of_dict[eval(group)[0], eval(group)[1]] = arr_dict

打印上面创建的np.数组中的值的代码:

for i in range(arr_of_dict.shape[0]):
    for j in range(arr_of_dict.shape[1]):
        arr = arr_of_dict[i,j]
        if len(arr):
            print(f'\ndatasets from group ({i}, {j})')
            [print(f'dataset {k}:\n{v}')  for k,v in arr.items() ]

创建示例文件的代码:

group_names = ['0, 0', '0, 1', '1, 0', '1, 1']
loaddir = 'test_datafile.hdf5'

with h5py.File(loaddir, 'w') as h5f:
    for group in group_names:
        grp = h5f.create_group(group)
        for i in range(3):
            arr = np.random.random(10).reshape(5,2)
            grp.create_dataset(f'ds_{i}', data=arr)

相关问题