做近似最近邻搜索的实验时,需要用到一些开源数据集,这些数据集的格式并不都是统一的,常见的有fvecs&ivecs格式,hdf5格式。能够读取和保存这些格式的文件是实验的基础,另一方面,测试不同的数据集时,可能需要将一种格式转换成另一种格式。
因为实验代码是以载入fvecs格式数据写的,需要将hdf5格式转换成fvecs&ivecs格式可以用python很方便的读取hdf5格式的数据集,在此基础上转换为fvec&ivecs格式。
hdf5格式的结构
一个hdf5格式的文件是一个包含两个对象的容器,一个是数据集(datasets),另一个是组(groups)。数据集的结构非常类似于Numpy的array,组的结构非常类似于python的字典,它像一个文件夹一样,它可以包含数据集和其它的组。总结起来:组像字典一样工作,数据集像NumPy数组一样工作。
拿hdf5格式数据集gist-960-euclidean.hdf5为例(下载地址),整个文件有一个根组,就是下图的"/"
。
根组下有四个键,分别为distances、neighbors、test和train,类比于上图中的A、B和C。distances对应的是shape为(1000, 100)的数据集(类比于Numpy的array),为每个查询向量最近的100个向量距该查询向量的距离,数据类型为float32;neighbors对应的是shape为(1000, 100)的数据集,为每个查询向量最近的100个向量,数据类型为int32;test对应的是shape为(1000000, 960)的数据集,这是基数据(原始数据),一共1000000个向量,每个向量的维度为960维,数据类型为float32;train对应的是shape为(1000, 960)的数据集,只是查询数据,一共1000个向量,向量的维度为960维,数据类型为float32。
读取转换过程
安装h5py模块。我的python是用anaconda装的,可以用下面命令安装。
1 | conda install h5py |
读取hdf5格式文件
1 | import h5py |
参考文献
[1]GZKPeng, HDF5 的介绍以及在python中的应用, https://blog.csdn.net/zkp_987/article/details/79852236, 2019.9.1.
[2]python中使用hdf5格式文件的文档:http://docs.h5py.org/en/stable/quick.html