HDF5是一个容器,具有用户定义的数据模式。因此,访问数据取决于模式。需要一些背景知识。HDF5、PyTables和NumPy对其数据对象使用略有不同的术语。
-
HDF5将数据存储在“数据集”中。它们可以存储同质数据或
异构(有时称为复合)数据。异构数据对象仅限于二维形状。
-
PyTables有两种类型的存储类(对象类型):“数组”用于同构数据(实际上有4种类型的数组)。“表”用于结构化数据(异构或复合数据)。
-
NumPy数组还可以存储同构或异构数据。数据类型由dype属性定义。
-
下表映射了包中的对象:
HDF5
|
PyTables
|
NumPy
|
异质性
|
表格
|
shape=(Nrows,),dtype定义字段/列名
|
同种类的
|
阵列
|
shape=任意,dytpe定义所有数据
|
这就是为什么需要更多信息来编写特定于您的文件的代码。不同的PyTables函数用于访问同构和异构数据集,返回的NumPy对象略有不同。
下面的代码从两个非常简单的文件中创建和读取数据。第一个代码段创建2个HDF5文件:第一个有1个异构/复合数据集(
_1ds.h5
),第二个有4个同质数据集(
_4ds.h5
). 你不需要知道如何创建文件。只需运行它并在HDFView中查看文件,即可查看下面“读取”代码中使用的数据结构。选择与您的文件匹配的一个。
创建以下文件的代码:
# Create some data, saved in a recarray with field names from post
names = ["Latitude", "Longitude", "fakeDim0", "fakeDim1"]
arr_dt = np.dtype( {'names':names, 'formats':[float for _ in range(len(names))]} )
recarr = np.empty(shape=(10,), dtype=arr_dt)
recarr["Latitude"] = [10.*x for x in range(10)]
recarr["Longitude"] = [-10.*x for x in range(10)]
recarr["fakeDim0"] = [0.1*x for x in range(10)]
recarr["fakeDim1"] = [0.2*x for x in range(10)]
with tb.File('SO_75898559_1ds.h5','w') as h5f:
h5f.create_table('/','Example_Table',obj=recarr)
with tb.File('SO_75898559_4ds.h5','w') as h5f:
for name in names:
#extract columns from recarray and save eaqch as seperate dataset
data = recarr[name]
h5f.create_array('/',name,obj=data)
读取以下文件的代码:
with tb.File('SO_75898559_1ds.h5','r') as h5f:
# use natural naming to define path to table
ex_table = h5f.root.Example_Table
# OR use get_node()
ex_table = h5f.get_node('/Example_Table')
recarr = ex_table.read()
print(f'For Table {ex_table._v_name}; np.array type = {type(recarr)}')
print(f'\tTable shape = {recarr.shape}')
print(f'\tTable dtype = {recarr.dtype}')
# to get an array of data from a field/column of recarr:
arr_lat = recarr["Latitude"]
# OR read from Table
arr_lat = ex_table.read(field="Latitude")
print("\nLatitude data:\n",arr_lat)
# to read data row-by-row from the table:
print("\nrow data:")
for row in ex_table:
print([row[fname] for fname in ex_table.colnames])
print()
with tb.File('SO_75898559_4ds.h5','r') as h5f:
for dset in h5f.iter_nodes('/',classname='Array'):
arr = dset.read()
print(f'For Array {dset._v_name}; np.array type = {type(arr)}')
print(f'\tArray shape = {arr.shape}')
print(f'\tArray dtype = {arr.dtype}')