8.2 区域引用
区域引用是HDF5最酷的特性之一。它允许你保存一个引用,这个引用指向数据集的某个部分。比如,你可能想要将HDF5文件中储存的某张照片的感兴趣区域(ROI)保存下来,这样,你就可以不必在之后的分析中处理整张照片。
8.2.1 创建和读取区域引用
你可以将区域引用看作是保存了切片访问数据集的参数。以前面创建的数据集为例,我们注意到它有一个属性叫regionref:
我们可以利用这个小小的代理对象保存我们的切片参数。你可以用标准的NumPy切片格式在这个对象上创建一个新的区域引用:
和对象引用一样,区域引用也是不透明的。其唯一可用的属性是shape:
它表示你切片选择的形状。也就是说,如果你将该切片参数应用于你的数据集上,HDF5返回的数组就是这个形状。
一旦你获得一个区域引用,你就可以直接以它为切片参数从数据集中获取数据:
8.2.2 复杂索引
记住,一旦你使用“复杂”索引(如布尔数组),那么shape将永远是1维的。这是为了模仿NumPy在进行此类切片选择时的行为。
假设我们有一个2维数组,它保存了一些随机数:
我们可以创建一个布尔数组表示所有大于0.5的元素:
然后创建一个该数组的区域引用:
一共有4个元素符合条件,所以选择的结果被“打包”成一个具有4个元素的1维数组。
选取元素时遵循某个规则。如果我们将该选择应用于数据集:
我们会看到位于[0,2],[1,2],[2,0],[2,1]的元素被依次选取。这是遵循C语言的顺序:步进首先发生在最后一维的索引,然后依次向前。
提示
不幸的是基于列表的选择也会返回1维数组,这一点跟NumPy不一样。(尝试一下!)这是HDF5标准库的一个限制。
8.2.3 用区域引用获得数据集
区域引用还有一个用途。如果你有一个区域引用,以上面的形状为(80,)的ref_out为例,你可以将它作为对象引用来获得整个数据集:
也就是说,如果你已经将某个数据集的区域引用保存在一个特征里,就不需要再另外保存该数据集的对象引用。
如果你只关注区域数据而不是数据集本身,你只需要这样做:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论