8.3 命名类型
HDF5还有另外一种“链接”的概念,比对象引用或区域引用更难以理解。我们已经在创建数据集(或特征)时见过,它是一种固定的数据类型。让我们来看个例子,假设我们的文件中有很多数据集包含图像数据,而你想要确保每个数据集都具有完全相同的类型。
HDF5提供了这样一种解决方案来保证这一点,它允许你在文件中独立于任何数据集或特征地保存一种数据类型。当你调用create_dataset时,你可以提供这一存储的类型而HDF5会将这个类型和新建的数据集建立“链接”。
8.3.1 数据类型对象
你可以简单地将一个NumPy的dtype赋给文件中的一个名字,从而创建这样一种独立的“命名”类型:
当我们打开一个命名类型时,我们得到的不是一个dtype,而是另外一种东西:
和数据集对象一样,这个h5py.Datatype对象是一个代理对象,它允许你访问底层的HDF5数据类型。其最显而易见的属性是Datatype.dtype,返回等效的NumPy的dtype对象:
由于它们是文件中的正式对象,所以你还会看到很多其他属性:
它还有.file属性表示其所在的h5py.File实例, .ref属性表示该类型的对象引用,以及各种特征,就跟Dataset和Group对象一样:
提示
由于技术原因,HDF5命名类型现在被称为已承诺类型。你可能两种说法都听过。对于我们来说,它们指的是同一样东西。
8.3.2 链接命名类型
创建一个使用命名类型对象的数据集或特征很简单,只需要在创建时提供一个Datatype的实例作为其dtype:
当你这样做时,HDF5不会将类型复制进数据集,而是在文件中另外创建了一个命名类型对象的引用。在帮助你保持数据的组织性的同时,还节省了磁盘空间。
至于特征也是一样,你必须在调用create方法时显式提供类型。比如,在根组创建一个使用我们命名类型的特征:
8.3.3 管理命名类型
命名类型一旦创建就不能更改,不过你可以从文件中删除它们:
但是不要耍花招用一个新的、不同的类型替代它。已经被数据集和特征引用的类型信息无法被删除。它将会一直存在,直到所有使用它的数据集和特征都从文件中被删除:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论