C++ 数组到 HDF5
C++ Array to HDF5
我需要将来自两个 float32 数组的数据存储在一个 .h5 文件中。这两个数组的大小都是 76800 (240x320),每个都代表一个图像。我很乐意将这两个数组按原样存储在 .h5 文件中,但由于我是 C++ 的初学者,所以我不知道如何执行此操作。
我查看了 here,但对于我的情况似乎没有必要转换为多数组。尽管这看起来是一个非常简单的问题,但我找不到一个简单的代码示例。
到目前为止,这是我的代码:
H5::H5File file("/home/m/Desktop/tryout/file.h5", H5F_ACC_TRUNC);
// Vector X
hsize_t dims_pol[1] = {f->flow_x.size()};
H5::DataSpace dataspace_x(1, dims_pol);
H5::IntType datatype_x(H5::PredType::NATIVE_FLOAT);
H5::DataSet dataset_x(file.createDataSet("p", datatype_x, dataspace_x));
dataset_x.write(f->flow_x.data(), H5::PredType::NATIVE_UINT8);
dataset_x.close();
但是,这只会将一个矢量写入文件,此外,我无法在 python(使用 pandas)中打开文件。不过它可以与 h5dump 一起使用。
感谢您的帮助
解决您的问题的一种方法是在 C++ 中使用 HDFql,如下所示:
// declare variables 'arr1' and 'arr2'
float arr1[240][320];
float arr2[240][320];
// populate variable 'arr1' with values
// populate variable 'arr2' with values
// register variable 'arr1' for subsequent usage (by HDFql)
HDFql::variableTransientRegister(&arr1);
// create dataset 'dset1' of data type float (size 240x320) populated with values from 'arr1'
HDFql::execute("create dataset dset1 as float(240, 320) values from memory 0");
// register variable 'arr2' for subsequent usage (by HDFql)
HDFql::variableTransientRegister(&arr2);
// create dataset 'dset2' of data type float (size 240x320) populated with values from 'arr2'
HDFql::execute("create dataset dset2 as float(240, 320) values from memory 0");
可以在 HDFql 中找到更多信息 reference manual。
我想我找到了解决方案,虽然我不是很满意,因为 pandas (python) 无法打开它,我必须使用 h5py。
但是,这是我的代码。如果您发现任何改进,请告诉我。
#include "H5Cpp.h"
H5::H5File file("/home/m/Desktop/tryout/file.h5", H5F_ACC_TRUNC);
// Vector X
hsize_t dims_pol[1] = {f->flow_x.size()};
H5::DataSpace dataspace_x(1, dims_pol);
H5::IntType datatype_x(H5::PredType::NATIVE_FLOAT);
H5::DataSet dataset_x(file.createDataSet("x", datatype_x, dataspace_x));
dataset_x.write(f->flow_x.data(), H5::PredType::NATIVE_FLOAT);
dataset_x.close();
// Vector Y
H5::DataSpace dataspace_y(1, dims_pol);
H5::IntType datatype_y(H5::PredType::NATIVE_FLOAT);
H5::DataSet dataset_y(file.createDataSet("y", datatype_y, dataspace_y));
dataset_y.write(f->flow_y.data(), H5::PredType::NATIVE_FLOAT);
dataset_y.close();
我需要将来自两个 float32 数组的数据存储在一个 .h5 文件中。这两个数组的大小都是 76800 (240x320),每个都代表一个图像。我很乐意将这两个数组按原样存储在 .h5 文件中,但由于我是 C++ 的初学者,所以我不知道如何执行此操作。
我查看了 here,但对于我的情况似乎没有必要转换为多数组。尽管这看起来是一个非常简单的问题,但我找不到一个简单的代码示例。
到目前为止,这是我的代码:
H5::H5File file("/home/m/Desktop/tryout/file.h5", H5F_ACC_TRUNC);
// Vector X
hsize_t dims_pol[1] = {f->flow_x.size()};
H5::DataSpace dataspace_x(1, dims_pol);
H5::IntType datatype_x(H5::PredType::NATIVE_FLOAT);
H5::DataSet dataset_x(file.createDataSet("p", datatype_x, dataspace_x));
dataset_x.write(f->flow_x.data(), H5::PredType::NATIVE_UINT8);
dataset_x.close();
但是,这只会将一个矢量写入文件,此外,我无法在 python(使用 pandas)中打开文件。不过它可以与 h5dump 一起使用。
感谢您的帮助
解决您的问题的一种方法是在 C++ 中使用 HDFql,如下所示:
// declare variables 'arr1' and 'arr2'
float arr1[240][320];
float arr2[240][320];
// populate variable 'arr1' with values
// populate variable 'arr2' with values
// register variable 'arr1' for subsequent usage (by HDFql)
HDFql::variableTransientRegister(&arr1);
// create dataset 'dset1' of data type float (size 240x320) populated with values from 'arr1'
HDFql::execute("create dataset dset1 as float(240, 320) values from memory 0");
// register variable 'arr2' for subsequent usage (by HDFql)
HDFql::variableTransientRegister(&arr2);
// create dataset 'dset2' of data type float (size 240x320) populated with values from 'arr2'
HDFql::execute("create dataset dset2 as float(240, 320) values from memory 0");
可以在 HDFql 中找到更多信息 reference manual。
我想我找到了解决方案,虽然我不是很满意,因为 pandas (python) 无法打开它,我必须使用 h5py。
但是,这是我的代码。如果您发现任何改进,请告诉我。
#include "H5Cpp.h"
H5::H5File file("/home/m/Desktop/tryout/file.h5", H5F_ACC_TRUNC);
// Vector X
hsize_t dims_pol[1] = {f->flow_x.size()};
H5::DataSpace dataspace_x(1, dims_pol);
H5::IntType datatype_x(H5::PredType::NATIVE_FLOAT);
H5::DataSet dataset_x(file.createDataSet("x", datatype_x, dataspace_x));
dataset_x.write(f->flow_x.data(), H5::PredType::NATIVE_FLOAT);
dataset_x.close();
// Vector Y
H5::DataSpace dataspace_y(1, dims_pol);
H5::IntType datatype_y(H5::PredType::NATIVE_FLOAT);
H5::DataSet dataset_y(file.createDataSet("y", datatype_y, dataspace_y));
dataset_y.write(f->flow_y.data(), H5::PredType::NATIVE_FLOAT);
dataset_y.close();