三维阵列整形?HDF5数据集类型



我有以下形状的数据:(127260,21250(

该数据的类型为<HDF5 dataset "data": shape (127260, 2, 1250), type "<f8">

第一维度(127260(是信号的数量,第二维度(2(是信号类型,第三维度(1250(是每个信号中的点数。

我想做的是减少每个信号的点数,将它们减半,在每个信号上留下625个点,然后将信号量增加一倍

如何将HDF5数据集转换为类似numpy数组的数据集,以及如何进行此重塑?

如果我理解,您需要一个新的数据集,其形状为:(2*127260, 2, 625)。如果是这样,那么将数据集的2个切片读取到2个NumPy数组中,从这些切片创建一个新数组,然后写入一个新的数据集就相当简单了。注意:读取切片既简单又快速。除非你有令人信服的理由创建一个新的数据集,否则我会让数据保持原样,并随时进行

执行此操作的代码(其中h5f是h5py文件对象(:

new_arr = np.empty((2*127260, 2, 625))
arr1 = h5f['dataset_name'][:,:, :625]
arr2 = h5f['dataset_name'][:,:,  625:]
new_arr[:127260,:,:] = arr1 
new_arr[127260:,:,:] = arr2 
h5f.create_dataset('new_dataset_name',data=new_arr)

或者你可以这样做(并结合两个步骤(:

new_arr = np.empty((2*127260, 2, 625))
new_arr[:127260,:,:] = h5f['dataset_name'][:,:, :625]
new_arr[127260:,:,:] = h5f['dataset_name'][:,:,  625:]
h5f.create_dataset('new_dataset_name',data=new_arr)

这是第三种方法。这是最直接的方法,并且减少了内存开销。当您有非常大的数据集无法放入内存时,这一点非常重要。

h5f.create_dataset('new_dataset_name',shape=(2*127260, 2, 625),dtype=float)
h5f['new_dataset_name'][:127260,:,:] = h5f['dataset_name'][:,:, :625]
h5f['new_dataset_name'][127260:,:,:] = h5f['dataset_name'][:,:,  625:]

无论你选择哪种方法,我建议添加一个属性来记录数据源以供将来参考:

h5f['new_dataset_name'].attrs['Data Source'] = 'data sliced from dataset_name'

最新更新