gpt4 book ai didi

python - 如何将 float 的 2D std vector 写入 HDF5 文件,然后在 python 中读取它

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:57 25 4
gpt4 key购买 nike

我想将 float 的二维 vector 写入 HDF5 文件。我使用了以下代码 (writeh5.cpp):

#include <cstdlib> 
#include <ctime>
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <H5Cpp.h>

using namespace H5;
using namespace std;

int main(void) {
int nrow = 5;
int ncol = 4;

vector<vector< double > > vec2d;
vec2d.resize(nrow, vector<double>(ncol, 0.0));

srand((unsigned)time(0));

typename vector< vector< double > >::iterator row;
typename vector< double >::iterator col;
for (row = vec2d.begin(); row != vec2d.end(); row++) {
cout << endl;
for (col = row->begin(); col != row->end(); col++) {

*col = (rand()/(RAND_MAX+1.0));
cout << *col << '\t';
}
}
cout << endl;

H5File file("test.h5", H5F_ACC_TRUNC);

// dataset dimensions
hsize_t dimsf[2];
dimsf[0] = nrow;
dimsf[1] = ncol;
DataSpace dataspace(2, dimsf);

DataType datatype(H5::PredType::NATIVE_DOUBLE);
DataSet dataset = file.createDataSet("data", datatype, dataspace);

// dataset.write(vec2d.data(), H5::PredType::NATIVE_DOUBLE);
dataset.write(&vec2d[0][0], H5::PredType::NATIVE_DOUBLE);

cout << endl << " vec2d has " << endl;
for (row = vec2d.begin(); row != vec2d.end(); row++) {
cout << endl;
for (col = row->begin(); col != row->end(); col++) {

cout << *col << '\t';
}
}
cout << endl;

dataset.close();
dataspace.close();
file.close();

return 0;
}

我使用 g++ writeh5.cpp -I/usr/include/hdf5/-lhdf5_cpp -lhdf5 -Wall 编译了它

代码运行产生以下输出:

0.325553        0.598941        0.364489        0.0125061
0.374205 0.0319419 0.380329 0.815621
0.863754 0.386279 0.0173515 0.15448
0.703936 0.372486 0.728436 0.991631
0.666207 0.568983 0.807475 0.964276

和文件test.h5

然后当我从 python 中读取这个文件时(使用以下内容)

import h5py
import numpy as np

file = h5py.File("test.h5", 'r')
dataset = np.array(file["data"])

print dataset

file.close()

我得到了

 [[  3.25553381e-001   5.98941262e-001   3.64488814e-001   1.25061036e-002]
[ 0.00000000e+000 2.42092166e-322 3.74204732e-001 3.19418786e-002]
[ 3.80329057e-001 8.15620518e-001 0.00000000e+000 2.42092166e-322]
[ 8.63753530e-001 3.86278684e-001 1.73514970e-002 1.54479635e-001]
[ 0.00000000e+000 2.42092166e-322 7.03935940e-001 3.72486182e-001]]

第一行很好,其他行都是垃圾。

我尝试了 dataset.write(&vec2d[0]...dataset.write(vec2d[0].data()...,我得到了类似的问题。

我要

  1. 编写一个包含 2D std::vector of double 内容的 HDF5 文件,
  2. 用python读取文件并将内容存储在一个numpy数组中

我做错了什么?

最佳答案

显然,我不允许将 vector 的 std::vector 传递给写入函数。因此,将 vector 的元素复制到静态数组就解决了这个问题,因为写入函数很乐意接受这个数组。

但是,我对这个解决方案不满意,我希望使用 vector 直接进入写函数。

代码如下:

#include <cstdlib> 
#include <ctime>
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <H5Cpp.h>

using namespace H5;
using namespace std;

int main(void) {
int nrow = 5;
int ncol = 4;

vector<vector< double > > vec2d;
vec2d.resize(nrow, vector<double>(ncol, 0.0));

srand((unsigned)time(0));

// generate some data
typename vector< vector< double > >::iterator row;
typename vector< double >::iterator col;
for (row = vec2d.begin(); row != vec2d.end(); row++) {
cout << endl;
for (col = row->begin(); col != row->end(); col++) {
*col = (rand()/(RAND_MAX+1.0));
cout << *col << '\t';
}
}
cout << endl;

double varray[nrow][ncol];
for( int i = 0; i<nrow; ++i) {
cout << endl;
for( int j = 0; j<ncol; ++j) {
varray[i][j] = vec2d[i][j];
}
}

H5File file("test.h5", H5F_ACC_TRUNC);

// dataset dimensions
hsize_t dimsf[2];
dimsf[0] = nrow;
dimsf[1] = ncol;
DataSpace dataspace(2, dimsf);

DataType datatype(H5::PredType::NATIVE_DOUBLE);
DataSet dataset = file.createDataSet("data", datatype, dataspace);

dataset.write(varray, H5::PredType::NATIVE_DOUBLE);


cout << endl;

dataset.close();
dataspace.close();
file.close();
return 0;
}

关于python - 如何将 float 的 2D std vector 写入 HDF5 文件,然后在 python 中读取它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32447628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com