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

时间:2018-07-09 08:28:23

标签: python python-3.x hdf5 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] [...]中的所有零。有什么解决办法吗?感谢您的理解,我为此付出了很多努力。

1 个答案:

答案 0 :(得分:1)

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()

...的确切工作方式取决于您使用的类/库,尤其取决于__getitem__的实现方式。对于h5py,您可以咨询the documentation,它会提供一些见解,查看this discussion,或搜索其他确实有用的参考(肯定存在)。在这种情况下,我可以告诉您的是,...可用于读取和分配数据集的值。上面已说明了这一点,其中...被用作.value运算符的替代方法。

在您的示例中出现的问题是您假设df是指向数据的指针。事实并非如此,它是副本。实际上df位于内存中,而文件中存储的数据位于该磁盘上。因此,修改df不会对您的文件执行任何操作(因为在许多情况下都需要这样做)。您需要积极地修改文件的内容,因为答案是正确的。

最后的注意事项:此代码非常简单。例如,它仅适用于没有组的文件。如果您想更笼统,则必须包括一些检查。