【问题标题】:need an efficient method to count datasets by name in an hdf5 file with Python需要一种有效的方法来使用 Python 在 hdf5 文件中按名称计算数据集
【发布时间】:2021-08-14 13:48:02
【问题描述】:

我有一个 dataset.h5 文件,其中包含使用以下格式编号的“文件”:

/frame_0000_000

其中前四个数字对应一个人的ID,后三个数字对应图像ID。本质上它在文件中看起来像这样(但有数千个条目)

/frame_0000_000
/frame_0000_001
/frame_0000_002
/frame_0001_000
/frame_0001_001

我正在尝试将每个人作为一个元素创建一个数组(基于文件),并尝试创建第二个数组,其中包含每个人的图像数量。即人 0 有 3 张图片。

以下是我尝试过的,但我不禁认为必须有更好的方法(更有效),这就是我问的原因。我已经搜索了很多,希望得到指导。特别是因为我的代码无法识别最后一个人的图像数量。

我仍在学习编码,非常感谢您的帮助。谢谢。

P.S 我无法共享数据集。

import h5py
test = h5py.File(filename, 'r')

uniquesubjects = []
uniqueframes = []

count = 0
for (idx,st) in enumerate (test,1):
    splitter = st.split('_')    
    if (splitter[0]=='frame'):
        subject = splitter[1]
        if subject not in uniquesubjects and subject =='0000':
            uniquesubjects.append(subject)
        if subject not in uniquesubjects:
            uniquesubjects.append(subject)
            uniqueframes.append(count)
            count = 0
        if subject in uniquesubjects:
            count = count+1
print(uniqueframes)
print(uniquesubjects)

【问题讨论】:

    标签: python hdf5 h5py


    【解决方案1】:

    我认为字典对于您的目的来说是一种更好的数据结构。 此示例创建一个 HDF5 文件来模拟您的文件结构。每个主题都有随机数量的帧(1-4 之间)。
    创建文件后,它在根级别名称上循环(假设所有都是数据集),并创建一个字典,其中键是主题 ID,值是计数。
    退出循环后,它会从字典中创建 3 个不同的 NumPy 数组:1)arr0 有主题和计数,2)arr1 只有主题和 3)arr2 只有数量。
    一切都被打印出来,所以你可以看到发生了什么。

    import h5py
    import numpy as np
      
    arr = np.random.rand(10,2,2)
    with h5py.File('SO_67702838.h5','w') as h5f:
        for pid in range(0,220,20):
            nframes = np.random.randint(1,5)
            for nfr in range(nframes):
                h5f.create_dataset(f'frame_{pid:04}_{nfr:03}',data=arr)
     
    with h5py.File('SO_67702838.h5','r') as h5f:       
        subject_counts = {}   
        for ds_name in h5f.keys():
            subject = ds_name[6:10]
               
            if subject not in subject_counts:
                count = 1
            else:
                count += 1
            subject_counts[subject]=count
                
    print(subject_counts)            
    arr0 = np.array(list(subject_counts.items()))
    print(arr0)
    arr1 = np.array(list(subject_counts.keys()))
    print(arr1)
    arr2 = np.array(list(subject_counts.values()))
    print(arr2)
    

    【讨论】:

    • 非常感谢,你是个传奇
    • defaultdict 可能会使代码更简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    相关资源
    最近更新 更多