如何在h5py中使用HDF5尺寸标度

时间:2017-01-17 18:04:59

标签: python hdf5 h5py

HDF5具有维度比例的概念,如on the HDF5h5py网站所述。但是,这些解释都使用简洁或通用的例子,因此我并不真正了解如何使用维度比例。即,给定一些HDF5文件f['coordinates']中的数据集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]])

我想说清楚第一列是纬度,第二列是经度。尺寸比例是用于此吗?或者它们是否用于表示单位是度数。或两者兼而有之?

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

1 个答案:

答案 0 :(得分:2)

专门针对此问题,最好的答案可能是使用attributes

f['coordinates'].attrs['columns'] = ['latitude', 'longitude']

但是尺寸比例尺还可以用于其他方面。我将展示它们的用途,如何以类似于属性的方式使用它们,以及如何实际将f['coordinates']数据集作为标尺用于其他数据集。

尺寸比例

我同意这些文档页面不太清楚,因为它们在实际解释基本概念之前会陷入复杂的可能性并陷入技术细节中。我认为一些简单的例子应该可以使事情变得清楚。

首先,假设您在一天的过程中一直在跟踪外部温度-也许每小时每小时测量一次,总共进行24次测量。您可能会认为这是两列数据:一列表示小时,一列表示温度。您可以将其存储为形状为24x2的单个数据集。但是时间和温度具有不同的单位,并且实际上是不同的数据类型。因此,将时间和温度存储为单独的数据集可能更有意义-分别命名为"time""temperature",每个形状均为24号形状。但是您还需要更加清楚它们是什么以及它们之间的关系。这种关系才是真正的“维度尺度”。

如果您想将温度绘制为时间的函数,则可以标签标记为“时间(一天中的小时)”,将比例标记为水平轴将是小时数,它会告诉您绘制每个温度的水平位置。您可以像这样通过h5py存储此信息:

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

请注意,make_scale的参数是有关特定time数据集的特定信息-在这种情况下,我们用来测量time的单位-而label是该维度的更一般概念。还要注意,将单位信息附加为属性实际上是更标准的方法,但是我更喜欢这种方法来指定刻度的单位,因为它很简单。

现在,假设我们在三个不同的地方(例如洛杉矶,芝加哥和纽约)测量了温度。现在,我们的温度阵列将具有24x3的形状。我们仍然需要dim[0]的时间范围,但现在我们还有dim[1]可以处理。

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

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

    latlong = f.create_dataset("latlong",
        data=[[34.0522, 118.2437], [41.8781, 87.6298], [40.7128, 74.0060]]
    )
    latlong.make_scale("latitude and longitude (degrees)")
    temp.dims[1].attach_scale(latlong)

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

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

输出看起来像这样:

Datasets: ['cities', 'latlong', 'temperature', 'time']
Temperature dimension labels: ['Time', 'Location']
Temperature dim[1] scales: ['city', 'latitude and longitude (degrees)']
[[ 34.0522 118.2437]
 [ 41.8781  87.6298]
 [ 40.7128  74.006 ]]