繁体   English   中英

Xarray合并两个不同维度长度的hdf5文件

[英]Xarray to merge two hdf5 file with different dimension length

我有一些仪器数据以 hdf-5 格式保存为多个二维数组以及测量时间。 如下图, d1d2是仪器在不同时间记录的两个独立文件。 它们具有相同的数据变量,唯一的区别是phony_dim_0的长度,它代表随测量时间变化的总数据点。

在此处输入图片说明

在此处输入图片说明

这些文件需要加载到仪器公司提供的特定软件中才能获得有意义的结果。 我想用 Python xarray 合并多个文件,同时保持它们的原始格式,然后将一个合并的文件加载到软件中。

这是我的尝试:

files = os.listdir("DATA_PATH")
d1 = xarray.open_dataset(files[0])
d2 = xarray.open_dataset(files[1])

## copy a new one to save the merged data array.
d0 = d1

vars_ = [c for c in d1]
for var in vars_:
    d0[var].values = np.vstack([d1[var],d2[var]])

错误显示如下: replacement data must match the Variable's shape. replacement data has shape (761, 200); Variable has shape (441, 200) replacement data must match the Variable's shape. replacement data has shape (761, 200); Variable has shape (441, 200)

我想到了这个问题的两种解决方案:

  1. 将维度长度扩展到所有合并文件的总长度。
  2. 以与 d1 和 d2 相同的格式创建一个新的空数据框。

但是,我仍然无法弄清楚实现这一目标的功能。 任何意见或建议将不胜感激。

补充资料

数据集示例[d1] , [d2]

我不熟悉 xarray,所以无法帮助你的代码。 但是,您不需要 xarray 来复制 HDF5 数据; h5py 旨在将 HDF5 数据作为 NumPy 数组很好地处理,并且是您合并数据所需的全部内容。

关于 Xarray 的说明。 它使用与 HDF5 和 h5py 不同的命名法。 Xarray 将文件称为“数据集”,并将 HDF5 数据集称为“数据变量”。 HDF5/h5py 命名法更常用,所以我将在我的帖子的其余部分使用它。

跨 2 个或多个 HDF5 文件合并数据集时需要考虑一些事项。 他们是:

  1. 数据模式的一致性(您已经检查过)。
  2. 属性的一致性。 如果数据集具有不同的属性名称或值,合并过程会变得更加复杂! (你的似乎是一致的。)
  3. 最好在合并的文件中创建 resizabe 数据集。 这简化了过程,因为您在最初创建数据集时不需要知道总大小。 更好的是,您可以稍后添加更多数据(如果/当您有更多文件时)。

我看了你的文件。 每个文件中有 8 个 HDF5 数据集。 一件好事:数据集可以调整大小。 这简化了合并过程。 此外,尽管您的数据集有很多属性,但它们在两个文件中似乎都很常见。 这也简化了过程。

下面的代码通过以下步骤来合并数据。

  1. 打开新的合并文件进行写入
  2. 打开第一个数据文件(只读)
  3. 循环遍历所有数据集
    一种。 使用组复制功能复制数据集(数据加上maxshape参数,以及属性名称和值)。
  4. 打开第二个数据文件(只读)
  5. 循环遍历所有数据集并执行以下操作:
    一种。 获取 2 个数据集的大小(现有的和要添加的)
    使用.resize()方法增加 HDF5 数据集的大小
    C。 将数据集的值写入现有数据集的末尾
  6. 最后,它maxshape所有 3 个文件并打印所有数据集的shapemaxshape (用于视觉比较)。

代码如下:

import h5py

files = [ '211008_778183_m.h5', '211008_778624_m.h5', 'merged_.h5' ]

# Create the merge file:
    with h5py.File('merged_.h5','w') as h5fw:
    
    # Open first HDF5 file and copy each dataset.
    # Will use maxhape and attributes from existing dataset.
    with h5py.File(files[0],'r') as h5fr:            
        for ds in h5fr.keys():
            h5fw.copy(h5fr[ds], h5fw, name=ds)
                 
    # Open second HDF5 file and copy data from each dataset.
    # Resizes existing dataset as needed to hold new data.
    with h5py.File(files[1],'r') as h5fr:            
        for ds in h5fr.keys():
            ds_a0 = h5fw[ds].shape[0]
            add_a0 = h5fr[ds].shape[0]
            h5fw[ds].resize(ds_a0+add_a0,axis=0)
            h5fw[ds][ds_a0:] = h5fr[ds][:]
    
for fname in files:
    print(f'Working on file:{fname}')
    with h5py.File(fname,'r') as h5f:
        for ds, h5obj in h5f.items():
            print (f'for: {ds}; axshape={h5obj.shape}, maxshape={h5obj.maxshape}')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM