Python 在C+中写入hdf5文件+;导致数据在某一点被截断

Python 在C+中写入hdf5文件+;导致数据在某一点被截断,python,c++,hdf5,Python,C++,Hdf5,考虑以下代码: #include <H5Cpp.h> #include <vector> #include <eigen3/Eigen/Dense> #include <iostream> double* matrix_to_array(Eigen::MatrixXd const &input){ int const NX = input.rows(); int const NY = input.cols(); d

考虑以下代码:

#include <H5Cpp.h>
#include <vector>
#include <eigen3/Eigen/Dense>
#include <iostream>

double* matrix_to_array(Eigen::MatrixXd const &input){
    int const NX = input.rows();
    int const NY = input.cols();
    double *data = new double[NX*NY];
    for(std::size_t i=0; i<NX; i++){
        for(std::size_t j=0; j<NY; j++){
            data[j+i*NX] = input(i,j);
        }
    }
    return data;
}

int main() {

    Eigen::MatrixXd data = Eigen::MatrixXd::Random(124, 4654);
    data.fill(3);
    
    H5::H5File file("data.hdf5", H5F_ACC_TRUNC);
    hsize_t dimsf[2] = {data.rows(), data.cols()};
    H5::DataSpace dataspace(2, dimsf);
    H5::DataSet dataset = file.createDataSet("test_data_set", 
                                            H5::PredType::NATIVE_DOUBLE,
                                            dataspace);

    auto data_arr = matrix_to_array(data);

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

    delete[] data_arr;

}
在执行之后,我认为一切都很好,但是在运行下面的python代码时(这是bscly。只是逐行打印数据)


我意识到矩阵的前18000个左右的条目被正确地写入hdf5文件,而其余的由于某种原因被设置为零。我在上面的C++代码中检查了<代码>数据< /代码>和<代码> DATAYARR < /代码>,并且所有的两个矩阵的条目都设置为0,因此在编写过程中必须在HDF5文件中发生错误。问题是,我不知道在哪里。我到底遗漏了什么?

在尝试并参考了H5组的示例后,我让它开始工作

#include <iostream>
#include <string>
#include "H5Cpp.h"
#include <eigen3/Eigen/Dense>
using namespace H5;
int main (void){

   const H5std_string  FILE_NAME( "data.h5" );
   const H5std_string  DATASET_NAME( "DOUBLEArray" );
   const int   NX = 123;                    // dataset dimensions
   const int   NY = 4563;
   const int   RANK = 2;

   Eigen::MatrixXd data = Eigen::MatrixXd::Random(NX, NY);

   int i, j;
   double data_arr[NX][NY];          // buffer for data to write
   for (j = 0; j < NX; j++)
   {
      for (i = 0; i < NY; i++)
        data_arr[j][i] = data(j,i);
   }

    H5File file( FILE_NAME, H5F_ACC_TRUNC );
    hsize_t     dimsf[2];              // dataset dimensions
    dimsf[0] = NX;
    dimsf[1] = NY;
    DataSpace dataspace( RANK, dimsf );
    /*
    * Define datatype for the data in the file.
    * We will store little endian DOUBLE numbers.
    */
    FloatType datatype( PredType::NATIVE_DOUBLE );
    datatype.setOrder( H5T_ORDER_LE );

    DataSet dataset = file.createDataSet( DATASET_NAME, datatype, dataspace );

    dataset.write( data_arr, PredType::NATIVE_DOUBLE );

}

而在问题中,我们只是传递
PredType::NATIVE\u DOUBLE
作为参数。我无法解释为什么或者这是否解决了问题…

我对HDF5不太熟悉,但我注意到您的数据缓冲区是用一维表示的2d矩阵。传递给数据集的数据空间也是二维的。HDF5是否假定它总是会收到一个“展平”的矩阵,或者您需要更改数据空间?@AndyG这是一个很好的观点,老实说,我不确定,因为这几乎是我第一次使用HDF5。。我是基于上面的代码编写的。我不是HDF5库的专家,但我最近使用过它,我很确定它确实需要一个扁平矩阵。@prpin但是你应该如何恢复数据的原始形状呢?
import h5py
import numpy as np

hf = h5py.File("build/data.hdf5", "r")

keys = list(hf.keys()) 
data_set = hf.get(keys[0]) 
data_set_np = np.array(data_set)

for row in data_set_np:
    print(row)
#include <iostream>
#include <string>
#include "H5Cpp.h"
#include <eigen3/Eigen/Dense>
using namespace H5;
int main (void){

   const H5std_string  FILE_NAME( "data.h5" );
   const H5std_string  DATASET_NAME( "DOUBLEArray" );
   const int   NX = 123;                    // dataset dimensions
   const int   NY = 4563;
   const int   RANK = 2;

   Eigen::MatrixXd data = Eigen::MatrixXd::Random(NX, NY);

   int i, j;
   double data_arr[NX][NY];          // buffer for data to write
   for (j = 0; j < NX; j++)
   {
      for (i = 0; i < NY; i++)
        data_arr[j][i] = data(j,i);
   }

    H5File file( FILE_NAME, H5F_ACC_TRUNC );
    hsize_t     dimsf[2];              // dataset dimensions
    dimsf[0] = NX;
    dimsf[1] = NY;
    DataSpace dataspace( RANK, dimsf );
    /*
    * Define datatype for the data in the file.
    * We will store little endian DOUBLE numbers.
    */
    FloatType datatype( PredType::NATIVE_DOUBLE );
    datatype.setOrder( H5T_ORDER_LE );

    DataSet dataset = file.createDataSet( DATASET_NAME, datatype, dataspace );

    dataset.write( data_arr, PredType::NATIVE_DOUBLE );

}
FloatType datatype( PredType::NATIVE_DOUBLE );
        datatype.setOrder( H5T_ORDER_LE );