Cao*_*s21 5 c++ python numpy hdf5
我想写一个浮动的2D矢量到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;
}
Run Code Online (Sandbox Code Playgroud)
我用它编译了它 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
Run Code Online (Sandbox Code Playgroud)
和文件 test.h5
然后,当我从python中读取此文件时(使用以下内容)
import h5py
import numpy as np
file = h5py.File("test.h5", 'r')
dataset = np.array(file["data"])
print dataset
file.close()
Run Code Online (Sandbox Code Playgroud)
我有
[[ 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]]
Run Code Online (Sandbox Code Playgroud)
第一行是好的,其他行是垃圾.
我试着用dataset.write(&vec2d[0]...和dataset.write(vec2d[0].data()...,我得到了类似的问题.
我想要
我做错了什么?
当我将数据从向量转换为动态二维数组时,我遇到了同样的问题。h5write 命令的问题不是它不接受向量,而是它不理解指针数组的概念。它只写出连续的内存。向量的向量在内存中并不连续,而是指向一堆向量的指针数组。这就是为什么当您传递数组的第一个元素时,第一行是正确的。表的其余部分只是第一个向量后面的内存中的垃圾。
我的解决方案是创建一个巨大的一维向量并执行我自己的索引来来回转换。这类似于 h5_writedyn.c https://www.hdfgroup.org/ftp/HDF5/examples/misc-examples/h5_writedyn.c中的方法
| 归档时间: |
|
| 查看次数: |
3395 次 |
| 最近记录: |