使用 python 和 h5py 更新 hdf5 中的键值

updating a key value in hdf5 using python and h5py

我有一个包含多个密钥的 hdf5 文件。我想在做一些调整后更新所有键的值。怎么做?

这是我的代码:

hf=h5py.File(fileName,"r+")
keys=hf.keys()
for i in keys:
    df=hf[i].value
    df=df-np.mean(df)
hf.close()

但是当我在 "r" 模式下读取这个文件时,它仍然显示相同的意思,这意味着它还没有更新。知道哪里可能出错吗?

上述问题已在提供的答案中得到解决。然而, 我现在正在尝试校准结果数据。 我使用的代码是:

data = hf[key][...]
hf[key][...] = data*calibration_factor

只是为了简单的校准。但是,其结果为 hf[key][...] 中的全零。有什么可能的解决方案吗?我为此苦苦挣扎,感谢您的理解。

this answer 中所示:您想要 分配值 ,而不是创建数据集。在这种情况下,后者在任何情况下都不起作用,因为存在数据集。

要分配值,您可以使用 Python 省略号索引(... 索引):

import h5py
import numpy as np

# create some file
# ----------------

hf = h5py.File('example.hdf5', 'w')

hf['/foo'] = np.random.random(100)
hf['/bar'] = np.random.random(100) + 10.

hf.close()

# set all datasets to have a zero mean
# ------------------------------------

hf = h5py.File('example.hdf5', 'r+')

for key in hf:

  data = hf[key][...]

  hf[key][...] = data - np.mean(data)

hf.close()

# verify
# ------

hf = h5py.File('example.hdf5', 'r')

for key in hf:

  print(key, hf[key][...].shape, np.mean(hf[key][...]))

hf.close()

... 的确切工作方式取决于您使用的 class/library,特别是 __getitem__ 的实施方式。对于 h5py,您可以参考 the documentation which gives some insight, look at this discussion,或搜索其他好的参考资料(肯定存在)。在这种情况下,我可以告诉您的是 ... 可用于读取和分配数据集的值。如上所示,其中 ... 已被用作 .value 运算符的替代方法。

您的示例中出了什么问题是您假设 df 是指向数据的指针。这不是这样的,它是一个副本。实际上 df 存在于内存中,而文件中存储的数据存在于该磁盘中。所以修改 df 不会对你的文件做任何事情(在很多情况下都是想要的行为)。您需要主动修改文件的内容,就像这个答案所做的那样。

最后一点:这段代码非常简单。例如,它仅适用于没有组的文件。如果你想更笼统,你必须包括一些支票。