附加到h5文件

2024-04-16 08:06:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个h5文件,其中包含如下数据集:

col1.      col2.      col3
 1           3          5
 5           4          9
 6           8          0
 7           2          5
 2           1          2

我有另一个h5文件,具有相同的列:

col1.      col2.      col3
 6           1          9
 8           2          7

我想将这两个连接起来,得到以下h5文件:

col1.      col2.      col3
 1           3          5
 5           4          9
 6           8          0
 7           2          5
 2           1          2
 6           1          9
 8           2          7

如果文件很大或者我们有很多这样的合并,那么最有效的方法是什么


Tags: 文件数据方法col2col3col1h5
1条回答
网友
1楼 · 发布于 2024-04-16 08:06:08

我对熊猫不熟悉,所以在那里我无能为力。这可以通过h5py或pytables完成。正如@hpaulj所提到的,该过程将数据集读取到一个numpy数组中,然后使用h5py写入HDF5数据集。确切的过程取决于maxshape属性(它控制数据集是否可以调整大小)

我创建了示例来展示这两种方法(固定大小或可调整大小的数据集)。第一个方法创建一个新的file3,它组合了file1和file2中的值。第二种方法将值从file2添加到file1e(可调整大小)。注意:创建示例中使用的文件的代码位于末尾

我有一个较长的答案,以便显示复制数据的所有方法。
看到这个答案:How can I combine multiple .h5 file?

方法1:将数据集合并到新文件中
未使用maxshape=参数创建数据集时需要此选项

with h5py.File('file1.h5','r') as h5f1,  \
     h5py.File('file2.h5','r') as h5f2,  \
     h5py.File('file3.h5','w') as h5f3 :
         
    print (h5f1['ds_1'].shape, h5f1['ds_1'].maxshape)
    print (h5f2['ds_2'].shape, h5f2['ds_2'].maxshape)    

    arr1_a0 = h5f1['ds_1'].shape[0]            
    arr2_a0 = h5f2['ds_2'].shape[0]            
    arr3_a0 = arr1_a0 + arr2_a0          
    h5f3.create_dataset('ds_3', dtype=h5f1['ds_1'].dtype,
                        shape=(arr3_a0,3), maxshape=(None,3))

    xfer_arr1 = h5f1['ds_1']               
    h5f3['ds_3'][0:arr1_a0, :] = xfer_arr1
 
    xfer_arr2 = h5f2['ds_2']   
    h5f3['ds_3'][arr1_a0:arr3_a0, :] = xfer_arr2

    print (h5f3['ds_3'].shape, h5f3['ds_3'].maxshape)

方法2:将文件2数据集附加到文件1数据集
必须使用maxshape=参数创建文件1e中的数据集

with h5py.File('file1e.h5','r+') as h5f1, \
     h5py.File('file2.h5','r') as h5f2 :

    print (h5f1['ds_1e'].shape, h5f1['ds_1e'].maxshape)
    print (h5f2['ds_2'].shape, h5f2['ds_2'].maxshape)    
    
    arr1_a0 = h5f1['ds_1e'].shape[0]            
    arr2_a0 = h5f2['ds_2'].shape[0] 
    arr3_a0 = arr1_a0 + arr2_a0          

    h5f1['ds_1e'].resize(arr3_a0,axis=0)
    
    xfer_arr2 = h5f2['ds_2']   
    h5f1['ds_1e'][arr1_a0:arr3_a0, :] = xfer_arr2

    print (h5f1['ds_1e'].shape, h5f1['ds_1e'].maxshape)

创建上述示例文件的代码:

import h5py
import numpy as np

arr1 = np.array([[ 1, 3, 5 ],
                 [ 5, 4, 9 ],
                 [ 6, 8, 0 ],
                 [ 7, 2, 5 ],
                 [ 2, 1, 2 ]] )

with h5py.File('file1.h5','w') as h5f:
    h5f.create_dataset('ds_1',data=arr1)
    print (h5f['ds_1'].maxshape)   
    
with h5py.File('file1e.h5','w') as h5f:
    h5f.create_dataset('ds_1e',data=arr1, shape=(5,3), maxshape=(None,3))
    print (h5f['ds_1e'].maxshape)             
                 
arr2 = np.array([[ 6, 1, 9 ],
                 [ 8, 2, 7 ]] )
                 
with h5py.File('file2.h5','w') as h5f:
    h5f.create_dataset('ds_2',data=arr2)

相关问题 更多 >