需要一种有效的方法来在 Python 的 hdf5 文件中按名称计算数据集

need an efficient method to count datasets by name in an hdf5 file with Python

我有一个 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)

我认为字典是更适合您的数据结构。 此示例创建一个 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)