我在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文件的“自描述”性质。
答案 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。