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

使用python和h5py更新hdf5中的键值,python,python-3.x,hdf5,h5py,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”模式下读取此文件时,它仍然显示相同的平均值,这意味着它没有更新。知道哪里出了问题吗 上述问题已在提供的答案中解决。然而, 我现在正在尝试校准结果数据。 我使用的代码是

我有一个带有多个键的
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][…]中的所有零。有什么可能的解决办法吗?感谢您的理解,我在这方面做了很多努力。

如中所述:您希望分配值,而不是创建数据集。在这种情况下,后者无论如何都不起作用,因为数据集是存在的

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

..
的具体工作方式取决于您使用的类/库,特别是
\uuuu getitem\uuuu
的实现方式。对于h5py,您可以参考它,它提供了一些见解、查看或搜索其他好的参考资料(肯定存在)。在此上下文中,我可以告诉您,
可用于读取和分配数据集的值。如上所示,
..
已被用作
.value
运算符的替代

在您的示例中出错的是,您假设
df
是指向数据的指针。事实并非如此,这是一份副本。实际上,
df
保存在内存中,而文件中存储的数据保存在这个磁盘上。所以modify
df
不会对您的文件做任何事情(在许多情况下都是这样)。您需要主动地修改文件的内容,正如这个答案所做的那样


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

谢谢,我之前看到过,刚才又看到了,是的,几乎是一样的,但请你说明一下[…]的含义,因为我必须使用它两次,因为我必须多次使用它。这有帮助吗:?谢谢,我之前看到过,刚才又看到了,是的,几乎是一样的,但是你能不能告诉我这[…]意味着什么,因为我必须使用它两次,因为我必须使用它多次。因为它不是直接赋值,而是df=dfnp.mean(df),所以在这种情况下如何使用[…]呢?我有一个完整的答案和解释。也许只是一个评论:我认为“键”实际上是指“数据集”。非常感谢,它是这样工作的,我面临着另一个困难类似的数据=hf[键][…]hf[键][…]=数据*校准因子,因为简单的计算数据是由一个因子校准的。不幸的是,这将导致结果数据集中的所有零,hf[key][…]。但是,如果我将它分配给任何其他变量,它就可以正常工作。知道有什么问题吗?
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()