将 C++ 数据结构转换为可理解的 HDF5 数据集(对向量)
Convert C++ datastructure into intelligible HDF5 dataset (Vector of Pairs)
我在 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 文件的 'self-describing' 性质。
解决方案是复合数据类型,请参阅 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.
我在 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 文件的 'self-describing' 性质。
解决方案是复合数据类型,请参阅 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.