8.4 维度标尺
真实世界的数据都有量纲。假设我们有一个大气层模拟程序输出的3D数据集,每个数据代表一个立体空间中每个点的温度:
人们会很容易认出该数据集记录了“温度”,我们可以添加一个特征记录其标尺单位:
但还有一个更细微的问题。假设我们的模拟是基于一个对流过程,在z方向上的分辨率远高于x和y方向。比如,在垂直方向的分辨率可能是100m而水平方向却是10km。我们可以通过添加另一个特征来解决这个问题,如一个“步数”特征如下:
另外,每个坐标轴分别代表什么?我们可能会猜,第一个坐标轴是x方向吗?还是该模拟程序首先输出z?我猜我们可以靠添加第三个特征来记录这点:
当然,我们不得不将这些特征规范告诉所有的同事,而且如果视图软件不知道我们的特征规范,在将数据集可视化之后它看上去就是被“压扁”的。我估计如果我们在z方向上改用变长步数,视图软件就会崩溃……
此类问题是如此普遍以至于诞生了一个标准:HDF5维度标尺规范。和上面用特征表示的标尺系统一样,该功能也建立在HDF5之上,用标准的数据集、特征和引用等部件来创建一个更有表现力的对象。
像这样的功能有很多,全都由HDF组织(HDF5的作者和软件维护者)在一系列的RFC中标准化。这样做的一大好处是第三方应用程序知道如何处理一组特定的组、数据集、特征和引用的组合。比如,一个可视化程序可以识别出我们创建的坐标轴,并将我们的模拟输出“正确”渲染出来,或者根据HDF5图像标准选择正确的调色板来渲染一幅天文照片。
8.4.1 创建维度标尺
让我们重新回顾之前那个3D温度测量数据集。在使用维度标尺之前,先要删除那些我们自己添加的特征:
我们的数据集上有一个一直被我们忽视的属性:
这是我们维度标尺的入口。HDF5一个“维度标尺”就是一个拥有一些元数据的独立的“坐标轴”数据集,通过引用跟主数据集链接在一起。在我们的例子中,我们想要创建三个维度标尺:x轴,步长10km;y轴,步长是10km;z轴,步长100m。
为了记录这点,我们首先创建三个数据集来存放维度标尺的“坐标轴”:
现在,我们在dset.dims上调用create_scale,通过HDF5将它们转化成正式的“维度标尺”数据集:
值得花点时间看看实际发生了什么。让我们调查scale_x数据集都有哪些特征:
没错。create_scale干的唯一的事情就是将一些标准化的特征附加到数据集上。
8.4.2 在数据集上添加标尺
现在我们有了三个标尺,我们可以将它们跟我们的数据集关联起来。不过请注意,我们需要将每个标尺分别跟数据集对应的坐标轴关联。这些坐标轴通过Dataset.dims对象上的索引来表示:
dims[N]上的对象是另一个小代理,它帮助追踪每个维度标尺被附加到数据集的哪个轴上。没错,你还可以将多个标尺附加到同一个轴!这对于那些需要在一个轴的两个方向都创建坐标的人来说是个好消息。
dims[N]代理对象像一个有序字典一样工作,同时支持通过名字访问和通过索引访问。索引表示标尺被添加的顺序。比如,要访问x轴标尺的数据集,我们可以访问数据集维度“0”上的第一个标尺:
而要获取实际的坐标值,只需要对数据集切片:
我们还可以通过使用标尺创建时的名字进行字典风格的访问:
另外还有一些字典风格的方法也可以使用,包括items、keys和values。
最后,你还可以给数据集的每个坐标轴打上标签。这是记录哪个轴是x、y、z的正确地方:
现在我们已经介绍了所有的基本组件,是时候来谈一谈HDF5编程中最痛苦的问题之一——并发性了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论