是否有一种更有效和更少丑陋的方式来加载可变长度的数据到一个嵌套的数据结构在Python?



我有一些HDF5文件以分层方式保存(即多个文件夹包含多个文件,其中每个文件夹中的文件是相关的-我不是指单个HDF5文件的分层结构)。我想从每个文件中读取数据(矢量),并将其存储在反映文件之间层次结构的数据结构中。但是,不同文件的数据长度不同。在下面的示例中,数据存储在HDF5文件的一个名为&;data&;的字段中。

如果来自每个文件的数据长度相同,我将简单地使用NumPy数组。然而,由于长度可变,我一直使用嵌套列表如下:

import glob
import h5py 
# list of directories
dir_list = ["dir1", "dir2"]
# load data and store in nested list
data = []
for dir_idx, dir in enumerate(dir_list):
data.append([])
file_list = glob.glob(dir + "/*.hdf5")
for file_idx, file in enumerate(file_list):
with h5py.File(file, "r") as fid:
data[dir_idx].append(fid["data"][:])

这似乎效率低下,看起来很难看,但我不知道一个更好的解决方案。理想情况下,我希望使用NumPy,因为它具有更高效的内存管理。有人能提出一个更优雅的解决方案吗?

构建嵌套数组列表的更简洁的方法是:

data = []
for dir in dir_list:
data1 = []
file_list = glob.glob(dir + "/*.hdf5")
for file in file_list:
with h5py.File(file, "r") as fid:
data1.append(fid["data"][:])
data.append(data1)

它应该做同样的事情,只是没有enumerateidx。在性能上没有差别。它加载的是相同的数据

我想说你制作一个2d或更高的数组来存储数据集,但这只有在len(file_list)与所有dir相同的情况下才有可能,并且你提前知道这一点。如果所有的"数据"数据集的形状是一样的,你可以从

开始
arr = np.zeros((len(dir_list), len(file_list), N, M), float)

则枚举值在赋值给

时很有用。
arr[dir_index, file_index,:, : ] = fit['data'][:]

无论如何,你必须遍历dirs和文件。只要不在循环中使用np.append之类的东西,如何收集数组就没有太大关系。

最新更新