[英]Xarray to merge two hdf5 file with different dimension length
我有一些仪器数据以 hdf-5 格式保存为多个二维数组以及测量时间。 如下图, d1和d2是仪器在不同时间记录的两个独立文件。 它们具有相同的数据变量,唯一的区别是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)
我想到了这个问题的两种解决方案:
但是,我仍然无法弄清楚实现这一目标的功能。 任何意见或建议将不胜感激。
补充资料
我不熟悉 xarray,所以无法帮助你的代码。 但是,您不需要 xarray 来复制 HDF5 数据; h5py 旨在将 HDF5 数据作为 NumPy 数组很好地处理,并且是您合并数据所需的全部内容。
关于 Xarray 的说明。 它使用与 HDF5 和 h5py 不同的命名法。 Xarray 将文件称为“数据集”,并将 HDF5 数据集称为“数据变量”。 HDF5/h5py 命名法更常用,所以我将在我的帖子的其余部分使用它。
跨 2 个或多个 HDF5 文件合并数据集时需要考虑一些事项。 他们是:
我看了你的文件。 每个文件中有 8 个 HDF5 数据集。 一件好事:数据集可以调整大小。 这简化了合并过程。 此外,尽管您的数据集有很多属性,但它们在两个文件中似乎都很常见。 这也简化了过程。
下面的代码通过以下步骤来合并数据。
maxshape
参数,以及属性名称和值)。.resize()
方法增加 HDF5 数据集的大小maxshape
所有 3 个文件并打印所有数据集的shape
和maxshape
(用于视觉比较)。代码如下:
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.