需要一种有效的方法来在 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)
我有一个 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)