如何在h5py中使用HDF5维度尺度

equ*_*ghe 5 python hdf5 h5py

HDF5 具有维度尺度的概念,如HDF5h5py网站上所述。然而,这些解释都使用简洁或通用的例子,所以我不太明白如何使用维度比例。f['coordinates']即,给定某个 HDF5 文件中的数据集f = h5py.File('data.h5')

>>> f['coordinates'].value
array([[ 52.60636111,   4.38963889],
   [ 52.57877778,   4.43422222],
   [ 52.58319444,   4.42811111],
   ..., 
   [ 52.62269444,   4.43130556],
   [ 52.62711111,   4.42519444],
   [ 52.63152778,   4.41905556]])
Run Code Online (Sandbox Code Playgroud)

我想澄清的是,第一列是纬度,第二列是经度。为此使用尺寸刻度吗?或者它们用来表示单位是度。或两者?

也许另一个具体的例子可以更好地说明维度尺度的使用?如果您有,请分享,即使您没有使用 h5py。

Mik*_*ike 3

具体来说,对于这个问题,最好的答案可能是使用属性

\n
f[\'coordinates\'].attrs[\'columns\'] = [\'latitude\', \'longitude\']\n
Run Code Online (Sandbox Code Playgroud)\n

但尺寸尺度对于其他事情很有用。我将展示它们的用途、如何以类似于属性的方式使用它们,以及如何实际使用f[\'coordinates\']数据集作为比例作为其他数据集的

\n

尺寸尺度

\n

我同意这些文档页面并不那么清晰,因为在真正解释基本概念之前,它们就陷入了复杂的可能性并陷入了技术细节的泥潭。我认为一些简单的例子应该可以让事情变得清楚。

\n

首先,假设您在一天中记录了室外温度 \xe2\x80\x94\xc2\xa0,也许每小时都测量一次,总共 24 次测量。您可能会将其视为两列数据:\xc2\xa0,一列表示小时,一列表示温度。您可以将其存储为形状为 24x2 的单个数据集。但时间和温度有不同的单位,而且是不同的数据类型。"time"因此,将时间和温度存储为单独的数据集 \xe2\x80\x94\xc2\ xa0可能更有意义"temperature"每个数据集的形状为 24。但是您还需要更清楚地了解这些数据集是什么和它们之间的关系如何。这种关系就是“维度尺度”的真正用途。

\n

如果您想象将温度绘制为时间的函数,则可以将水平轴标记为“时间(一天中的小时)”,并将水平轴的刻度就是小时本身,告诉您绘制的水平位置每个温度。您可以通过 h5py 存储此信息,如下所示:

\n
with h5py.File("temperatures.h5", "w") as f:\n    time = f.create_dataset("time", data=...)\n    time.make_scale("hour of day")\n    temp = f.create_dataset("temperature", data=...)\n    temp.dims[0].label = "Time"\n    temp.dims[0].attach_scale(time)\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,参数make_scale是有关特定数据集 \xe2\x80\x94\xc2\xa0 的特定信息,在本例中,我们用于测量\xc2\xa0\xe2\x80\x94\xc2\xa0 的time单位,而timelabel而更通用该维度的概念。另请注意,将单位信息附加为属性实际上更标准,但我更喜欢这种指定比例单位的方法,因为它很简单。

\n

现在,假设我们测量了三个不同地点 \xe2\x80\x94\xc2\xa0say 的温度,即洛杉矶、芝加哥和纽约。现在,我们的温度数组的形状为 24x3。我们仍然需要 的时间尺度dim[0],但现在我们还必须dim[1]处理。

\n
with h5py.File("temperatures.h5", "w") as f:\n    time = f.create_dataset("time", data=...)\n    time.make_scale("hour of day")\n    cities = f.create_dataset("cities",\n        data=[s.encode() for s in ["Los Angeles", "Chicago", "New York"]]\n    )\n    cities.make_scale("city")\n    temp = f.create_dataset("temperature", data=...)\n    temp.dims[0].label = "Time"\n    temp.dims[0].attach_scale(time)\n    temp.dims[1].label = "Location"\n    temp.dims[1].attach_scale(cities)\n
Run Code Online (Sandbox Code Playgroud)\n

存储纬度和经度而不是城市名称可能更有用。您实际上可以同时附加两个类型的比例附加到同一尺寸。只需在最后一个代码块的底部添加如下代码:

\n
    latlong = f.create_dataset("latlong",\n        data=[[34.0522, 118.2437], [41.8781, 87.6298], [40.7128, 74.0060]]\n    )\n    latlong.make_scale("latitude and longitude (degrees)")\n    temp.dims[1].attach_scale(latlong)\n
Run Code Online (Sandbox Code Playgroud)\n

最后,您可以像这样访问这些标签和比例:

\n
with h5py.File("temperatures.h5", "r") as f:\n    print(\'Datasets:\', list(f))\n    print(\'Temperature dimension labels:\', [dim.label for dim in f[\'temperature\'].dims])\n    print(\'Temperature dim[1] scales:\', f[\'temperature\'].dims[1].keys())\n    latlong = f[\'temperature\'].dims[1][\'latitude and longitude (degrees)\'][:]\n    print(latlong)\n
Run Code Online (Sandbox Code Playgroud)\n

输出如下所示:

\n
Datasets: [\'cities\', \'latlong\', \'temperature\', \'time\']\nTemperature dimension labels: [\'Time\', \'Location\']\nTemperature dim[1] scales: [\'city\', \'latitude and longitude (degrees)\']\n[[ 34.0522 118.2437]\n [ 41.8781  87.6298]\n [ 40.7128  74.006 ]]\n
Run Code Online (Sandbox Code Playgroud)\n