使用xarray保存至HDF5格式时坐标ID丢失的问题求助
解决HDF5文件中xarray坐标ids丢失的问题
问题根源
你用h5py.create_dataset()存储xarray DataArray时,h5py只会提取DataArray底层的数值数组,不会保存xarray的元数据(包括coords里的ids坐标)。当前的HDF5文件里只有每个数据集的数值,完全没有存储ids的相关信息,这就是读取时找不到ids的原因。
另外你提到HDF5 Viewer无法打开文件,大概率是文件路径写法问题(你用了\\.\\data.h5,正确的相对路径应该是.\\data.h5或者直接data.h5),和ids丢失无关。
找回ids的可行方案
情况1:可以复现原ids列表
如果还记得生成ids时的随机种子,或者能重新运行生成代码得到相同的ids,直接复现后重新关联数据即可:
import random import string import h5py import xarray as xa # 设置和之前一致的随机种子,确保生成的ids完全相同 random.seed(42) # 替换为你实际使用的种子,没设置过可以尝试不同值测试 ids = [''.join(random.choice(string.ascii_uppercase) for _ in range(5)) for _ in range(10)] # 加载数据并重新构建带坐标的DataArray file = h5py.File(".\\data.h5", "r") data = file.get(ids[2]) data_array = xa.DataArray(data[:], dims=["id"], coords={"id": ids}) file.close() print(data_array)
情况2:无法复现原ids列表
如果没有保存随机种子,无法重新生成相同的ids,那么当前HDF5文件里没有任何ids的存储记录,无法找回原ids。只能重新生成新的ids,或者修改保存逻辑避免后续再出现这个问题。
避免后续丢失的正确保存方式
方式1:用xarray原生方法保存(推荐)
xarray自带的to_hdf会自动保存所有元数据(包括坐标),加载时直接恢复完整的DataArray/Dataset:
import numpy as np import xarray as xa import string import random random.seed(42) ids = [''.join(random.choice(string.ascii_uppercase) for _ in range(5)) for _ in range(10)] # 创建Dataset存储所有变量 ds = xa.Dataset() for i in ids: data = np.random.rand(10) ds[i] = xa.DataArray(data, dims=["id"], coords={"id": ids}) # 保存到HDF5 ds.to_hdf("data_correct.h5", key="dataset") # 加载数据 loaded_ds = xa.load_dataset("data_correct.h5", key="dataset") loaded_array = loaded_ds[ids[2]] print(loaded_array)
方式2:用h5py手动保存坐标
如果坚持用h5py操作,需要单独把ids作为一个数据集存储:
import numpy as np import h5py import string import random random.seed(42) ids = [''.join(random.choice(string.ascii_uppercase) for _ in range(5)) for _ in range(10)] save_h5py = h5py.File("data_with_ids.h5", "w") # 单独保存ids数组 save_h5py.create_dataset("ids", data=np.array(ids, dtype='U5')) # 保存各个数据 for i in ids: data = np.random.rand(10) save_h5py.create_dataset(i, data=data) save_h5py.close() # 加载时读取ids并关联数据 file = h5py.File("data_with_ids.h5", "r") saved_ids = file["ids"][:] data = file.get(saved_ids[2]) data_array = xa.DataArray(data[:], dims=["id"], coords={"id": saved_ids}) file.close() print(data_array)
内容的提问来源于stack exchange,提问作者linkey apiacess
相关产品推荐
相关产品推荐

