HDf 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');