3维数组重塑? HDF5 数据集类型?

3-dimensional array reshaping? HDF5 dataset type?

我有以下形状的数据:(127260, 2, 1250)

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

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

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

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

据我了解,您需要一个形状为 (2*127260, 2, 625) 的新数据集。如果是这样,将数据集的 2 个切片读入 2 个 NumPy 数组,从这些切片创建一个新数组,然后写入一个新数据集是相当简单的。注意:读取切片简单快速。我会保留数据 as-is 并执行此操作 on-the-fly 除非您有令人信服的理由创建新数据集

执行此操作的代码(其中 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)

您也可以这样做(并结合 2 个步骤):

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'