我不熟悉 HDF5 C++ 语法。看起来数据集“名称”有一个名为“L_1_3”的字段,带有一个字符串。有一种更简单的方法来获取 NumPy 数组(在处理大型数据集时更好)。我认为这将帮助您了解如何使用 HDF5 和 h5py。当您打印 dtype 时,您应该看到每个字段的名称。另外,我只使用 Python3,如果下面有任何语法错误,我深表歉意。
import h5py
fp = h5py.File("myfile.hdf5","r")
Data = fp["Name"] ## same as fp.get("Name")
# To work with the h5py dataset object
print Data.dtype, Data.shape
print Data[0]["L_1_3"] ## to get the first row from dataset
# To work with a NumPy array
Data_arr = fp["Name"][:] ## Adding [:] returns a NumPy array.
print Data_arr.dtype, Data_arr.shape
print Data_arr[0][0] ## to get the first row from NumPy array
# This notation might be required, depends on array dtype:
print Data_arr[0]["L_1_3"] ## to get the first row from NumPy array
上面的代码概述了从 HDF5/h5py 数据集读取数据的基本步骤。以下是使用 h5py 数据集对象与 NumPy 数组时的其他注意事项。其中一些在我对类似帖子的回复中进行了解释。链接在这里:Answer to 61464832
很容易混淆 h5py 数据集对象和 NumPy 数组。按照设计,它们具有相似的行为,但它们并不相同。两者都有形状和数据类型,支持数组样式的切片,并且可以与迭代器一起使用。这是一个关键区别:如果将数据集读入数组,则需要足够的内存来保存所有数据。 当您访问数据集对象时,您不会将所有数据都读入内存。当您访问庞大的数据集时,这一点至关重要。在我上面的示例中,Data 是一个数据集对象,Data_arr 是一个具有相同数据的 NumPy 数组。内存使用与您的小数据集无关。如果您的数据集很大,例如 (8000, 3, 1000, 2000) 浮点数组,这会产生很大的不同。这几乎是 48GB 的值,需要 384GB 的内存(如果我的数学是正确的)。
您可以在不创建数组的情况下执行许多“类似数组”的操作。唯一真正需要数组的时候是需要使用需要数组输入的 NumPy 函数。
这里有一些示例展示了如何使用类似于 NumPy 数组的 Data 数据集。
import h5py
fp = h5py.File("myfile.hdf5","r")
# iterate on rows in dataset "Name"
# Note how an array does not need to created
# could also use 'Data' object from above: Data = fp["Name"]
for row in fp["Name"] :
print row
# Slice the first row from the dataset
firstrow_arr = fp["Name"][0]
# Slice the last column from the dataset
lastcol_arr = fp["Name"][:,-1]