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

标签 python c++ numpy hdf5

我想将 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/

相关文章:

python - Flask session 变量在请求之间不持久

Python XML 绑定(bind)

python - 我如何进行查询以过滤 Django 中以数字开头的所有内容?

python - 创建一系列数字随机洗牌的二维数组的有效方法

python - 在 Python 中将字典存储为另一个字典的值

c++ - 你能在 ctor 中设置 weak_ptr<> 吗?

c++ - 处理带有奇怪字符的文本

c++ - 我可以在 Visual Basic 中使用 C++ 函数吗?

python - mpmath 中的 mpf 是什么意思?

python - 基于字符串应用 numpy 函数