HDf 5の使用
52776 ワード
目次pythonでの使用 ファイルの作成と開く hdf 5ファイルを保存 hdf 5ファイルの読み込み c++での使用 hdf 5ファイルを保存(2次元配列) hdf 5ファイル(4次元配列) を保存hdf 5ファイルの読み込み matlabで使用 ない.h 5ファイル 既存.h 5に配列 を書き込む
このブログの内容を重点的に参考にすることができます.
pythonでの使用
ファイルの作成と開く
hdf 5ファイルを保存
hdf 5ファイルの読み込み
c++での使用
hdf 5ファイルを保存(2次元配列)
hdf 5ファイルを保存(4次元配列)
その中で、上記のように配列に連続メモリを割り当てる方法をテストしました.どのような効果がありますか.
hdf 5ファイルの読み込み
matlabで使用
いいえ.h 5ファイル
原来h 5に配列を書き込む
以前はいくつかの書き込み配列を試してみましたが、書き込み配列が現れると元のファイルの配列が上書きされる場合があり、当時は次のコードを使っていたので、まだ使えていることがわかりました.
このブログの内容を重点的に参考にすることができます.
pythonでの使用
import h5py
ファイルの作成と開く
import h5py
#
# r ,
# r+ ,
# w ,
# w- x, ,
# a , ( )
file = h5py.File('file.h5', 'w')
file.close()
#
file_open = h5py.File('file.h5', 'r+')
file_open.close()
hdf 5ファイルを保存
# Write numpy array data and label to h5_filename
def save_h5(h5_filename, data, label, data_dtype='uint8', label_dtype='uint8'):
'''
svae_h5 h5
'''
h5_fout = h5py.File(h5_filename)
h5_fout.create_dataset(
'data', data=data,
compression='gzip', compression_opts=4,
dtype=data_dtype)
h5_fout.create_dataset(
'label', data=label,
compression='gzip', compression_opts=1,
dtype=label_dtype)
h5_fout.close()
''' str '''
import h5py
import numpy as np
dt = h5py.special_dtype(vlen=str)
data = np.array([['123'],['456']])
with h5py.File('testdict.h5','w') as f:
ds = f.create_dataset('test_dict', data.shape , dtype=dt)
ds[:] = data
#f.create_dataset('test_dict', data.shape , dtype=dt,data=data) # , !!!
hdf 5ファイルの読み込み
# Read numpy array data and label from h5_filename
def load_h5(h5_filename):
'''
load_h5 h5
'''
f = h5py.File(h5_filename)
data = f['data'][:]
label = f['label'][:]
return (data, label)
c++での使用
hdf 5ファイルを保存(2次元配列)
#include
#include
#include "hdf5.h"
/* */
int main(int argc, char* argv[]) {
// matrix ,
int rows = 10;
int columns = 8;
double* data_mem = new double[rows*columns];
double** matrix = new double*[rows];
for (int i = 0; i < rows; i++)
matrix[i] = data_mem + i*columns;
// matrix , ,
for (int r = 0; r < rows; r++) {
for (int c = 0; c < columns; c++) {
matrix[r][c] = r + 0.01*c;
}
}
// HDF5
hid_t file_id;
herr_t status;
file_id = H5Fcreate("my_file.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
// metadata dataspace
unsigned rank = 2;
hsize_t dims[2];
dims[0] = rows;
dims[1] = columns;
hid_t dataspace_id; // metadata dataspace id
// dataspace_id = H5Screate_simple(int rank,
// const hsize_t* current_dims,
// - 0,
// const hsize_t* max_dims,
// - NULL , current_dim ,
// - H5S_UNLIMITED, , dataset (chunked).
dataspace_id = H5Screate_simple(rank, dims, NULL);
//
hid_t dataset_id; // id
// dataset_id = H5Dcreate(loc_id, id
// const char *name,
// hid_t dtype_id,
// hid_t space_id, dataspace id
// (link) ,
// ,
// )
dataset_id = H5Dcreate(file_id, "/dset", H5T_NATIVE_DOUBLE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
//
// herr_t = H5Dwrite( id,
// ,
// memory_dataspace_id, dataspace
// - H5S_ALL: dataspace dataspace,file_dataspace_id dataspace
// file_dataspace_id, dataspace
// - H5S_ALL: datasapce , dataspace
// IO ,
// const void * buf,
status = H5Dwrite(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, matrix[0]);
// dataset
status = H5Dclose(dataset_id);
status = H5Sclose(dataspace_id);
//
status = H5Fclose(file_id);
//
delete[] matrix;
delete[] data_mem;
return 0;
}
hdf 5ファイルを保存(4次元配列)
void vector2hdf5(vector<Mat> &data, Mat &label, const char * filepath, string dataset1, string dataset2)
{
int data_rows = data.size();
int data_channel = 15;
int image_width = 96;
int image_height = 96;
int label_cols = label.cols;
int label_rows = label.rows;
hid_t file_id;
herr_t status;
file_id = H5Fcreate(filepath, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
int rank_data = 4, rank_label = 2;
hsize_t dims_data[4];
hsize_t dims_label[2];
dims_data[0] = data_rows;
dims_data[1] = data_channel;
dims_data[2] = image_height;
dims_data[3] = image_width;
dims_label[0] = label_rows;
dims_label[1] = label_cols;
hid_t data_id = H5Screate_simple(rank_data, dims_data, NULL);
hid_t label_id = H5Screate_simple(rank_label, dims_label, NULL);
hid_t dataset_id = H5Dcreate2(file_id, dataset1.c_str(), H5T_NATIVE_FLOAT, data_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
hid_t labelset_id = H5Dcreate2(file_id, dataset2.c_str(), H5T_NATIVE_INT, label_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
cout << data[0].channels() << " "<< data[0].rows<< " "<< data[0].cols<< endl;
float* data_mem = new float[data_rows * data_channel * image_height * image_width];
float **array_data = new float*[data_rows];
for (int j = 0; j < data_rows; j++) {
array_data[j] = data_mem + j * data_channel * image_height * image_width;// , array_data !!!
//for (int i = 0; i < image_height; i++)
//{
// float * ptr = data[j].ptr<float>(i);
// for (size_t k = 0; k < data_channel * image_width; k++)
// {
// array_data[j][i * data_channel * image_width + k] = ptr[k];
// //cout << ptr[k] << endl;
// }
//}
// H5 Mat
//H5:[num][15][96][96] Mat:[96][96][15]
for (int n = 0; n < 15; n++)
{
for (int i = 0; i < image_height; i++)
{
float * ptr = data[j].ptr<float>(i);
for (size_t k = 0; k < image_width; k++)
{
array_data[j][n*image_width *image_height +i*image_width + k] = ptr[k*data_channel + n];
}
}
}
}
int * label_mem = new int[label_rows*label_cols];
int **array_label = new int*[label_rows];
for (int j = 0; j < label_rows; j++) {
array_label[j] = label_mem + j*label_cols;
for (int i = 0; i < label_cols; i++)
{
array_label[j][i] = (int)label.at<int>(j, i);
}
}
status = H5Dwrite(dataset_id, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, array_data[0]);
status = H5Dwrite(labelset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, array_label[0]);
//
status = H5Sclose(data_id);
status = H5Sclose(label_id);
status = H5Dclose(dataset_id);
status = H5Dclose(labelset_id);
status = H5Fclose(file_id);
delete[] array_data;
delete[] array_label;
}
その中で、上記のように配列に連続メモリを割り当てる方法をテストしました.どのような効果がありますか.
float * p = new float[5 * 4];
float **pp = new float*[5];
for (int i = 0; i < 5; i++){
pp[i] = p + i * 4;// pp[i] float[5*4] , , float[5*4] , 5 float[4] 。
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 4; j++){
pp[0][i * 4 + j] = 0;
}
}
float monitor_0 = pp[0][0];
float monitor_1 = pp[1][0];
float monitor_2 = pp[2][0];
float monitor_3 = pp[3][0];
float monitor_4 = pp[4][0];
float out_monitor_1 = pp[1][19];
float out_monitor_2 = pp[2][19];
float out_monitor_3 = pp[3][19];
float out_monitor_4 = pp[4][19];
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 4; j++){
pp[1][i * 4 + j] = 1;
}
}
monitor_0 = pp[0][0];
monitor_1 = pp[1][0];
monitor_2 = pp[2][0];
monitor_3 = pp[3][0];
monitor_4 = pp[4][0];
out_monitor_1 = pp[1][19];
out_monitor_2 = pp[2][19];
out_monitor_3 = pp[3][19];
out_monitor_4 = pp[4][19];
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 4; j++){
pp[2][i * 4 + j] = 2;
}
}
monitor_0 = pp[0][0];
monitor_1 = pp[1][0];
monitor_2 = pp[2][0];
monitor_3 = pp[3][0];
monitor_4 = pp[4][0];
out_monitor_1 = pp[1][19];
out_monitor_2 = pp[2][19];
out_monitor_3 = pp[3][19];
out_monitor_4 = pp[4][19];
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 4; j++){
pp[3][i * 4 + j] = 3;
}
}
monitor_0 = pp[0][0];
monitor_1 = pp[1][0];
monitor_2 = pp[2][0];
monitor_3 = pp[3][0];
monitor_4 = pp[4][0];
out_monitor_1 = pp[1][19];
out_monitor_2 = pp[2][19];
out_monitor_3 = pp[3][19];
out_monitor_4 = pp[4][19];
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 4; j++){
pp[4][i * 4 + j] = 4;
}
}
monitor_0 = pp[0][0];
monitor_1 = pp[1][0];
monitor_2 = pp[2][0];
monitor_3 = pp[3][0];
monitor_4 = pp[4][0];
out_monitor_1 = pp[1][19];
out_monitor_2 = pp[2][19];
out_monitor_3 = pp[3][19];
out_monitor_4 = pp[4][19];
hdf 5ファイルの読み込み
/* */
#include
#include
#include "hdf5.h"
int main(int argc, char* argv[]) {
// matrix ,
int rows = 10;
int columns = 8;
double* data_mem = new double[rows*columns];
double** matrix = new double*[rows];
for (int i = 0; i < rows; i++)
matrix[i] = data_mem + i*columns;
// HDF5
hid_t file_id;
herr_t status;
file_id = H5Fopen("my_file.h5", H5F_ACC_RDWR, H5P_DEFAULT);
//
hid_t dataset_id; // id
// dataset_id = H5Dopen(group id,
// const char *name,
// )
dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT);
//
// herr_t = H5Dread( id,
// ,
// memory_dataspace_id, dataspace
// - H5S_ALL: dataspace dataspace,file_dataspace_id dataspace
// file_dataspace_id, dataspace
// - H5S_ALL: datasapce , dataspace
// IO ,
// const void * buf,
status = H5Dread(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, matrix[0]);
// dataset
status = H5Dclose(dataset_id);
//
status = H5Fclose(file_id);
//
delete[] matrix;
delete[] data_mem;
return 0;
}
matlabで使用
いいえ.h 5ファイル
hdf5write('XXX.h5','/Match_Message',match_message_by_gore);% 'XXX.h5' , ; 'XXX.h5' ,
hdf5write('XXX.h5','/Rot_Mat',Rot_by_gore,'WriteMode', 'append');% 'XXX.h5' ,
原来h 5に配列を書き込む
以前はいくつかの書き込み配列を試してみましたが、書き込み配列が現れると元のファイルの配列が上書きされる場合があり、当時は次のコードを使っていたので、まだ使えていることがわかりました.
dset_details.Location = '/Registration_idx_patch';
dset_details.Name = 'Registration_idx_patch';
% h5create(hdf5_file_name,'/Registration_idx_patch',[size(X,1),2],'WriteMode', 'append')
hdf5write(hdf5_file_name,dset_details,Registration_patch,'WriteMode', 'append');
dset_details.Location = '/Delaunay_face_node_idx';
dset_details.Name = 'Delaunay_face_node_idx';
% h5create(hdf5_file_name,'/Delaunay_face_node_idx',[size(TRI,1),size(TRI,2)])
hdf5write(hdf5_file_name,'/Delaunay_face_node_idx',TRI,'WriteMode', 'append');