将C ++数据结构转换为可理解的HDF5数据集(Vector of Pairs)

时间:2015-07-17 14:14:56

标签: python c++ hdf5

我在C ++中有以下数据结构:

std::vector<std::pair<boost::geometry::model::point<double, 3, boost::geometry::cs::cartesian>, std::vector<double>>>

在英语中,这表示一堆空间位置,每个位置都耦合到相同长度的元数据向量。

我需要帮助将此数据结构的优雅表示构建为HDF5数据集。

我的第一次尝试是使用(在Python中,作为模型)

import h5py
f = h5py.File('foo.h5', 'w')
f.create_dataset('locations_and_metadata', (num_locations, metadata_len + 3))

并简单地将数据集中的前三个元素解释为坐标,但这是丑陋且不直观的。特别是,我不能将单位作为属性添加到空间位置,这会降低HDF5文件的“自描述”性质。

1 个答案:

答案 0 :(得分:0)

解决方案是复合数据类型,请参阅here以获取示例。

为了解决这个特殊问题,我使用了:

#!/usr/bin/env python3
import h5py
import numpy

output = h5py.File('foo.h5', 'w')

len = 50

x0 = 1.23
y0 = 2.25
z0 = 7.84

a0 = numpy.random.uniform(size=len)

x1 = 2.34;
y1 = 4.38;
z1 = 7.25;

a1 = numpy.random.uniform(size=len)

comp_type = numpy.dtype([('x', numpy.float64), ('y', numpy.float64), ('z', numpy.float64), ('trace', (numpy.dtype('<d'), len))])
g = output.create_dataset('my_type', (2,), comp_type)
data = numpy.array([(x0, y0, z0, a0), (x1, y1, z1, a1)], dtype=comp_type)
g[...] = data

output.close()

C ++中的代码有点复杂;基本上我必须创建一个连续的双精度数组(因为std::pair不能保证在RAM中是连续的),但查看H5::CompType的文档应该可以找到你需要去的地方。 C ++示例是here