我有一个带有几个键的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] [...]中的所有零。有什么解决办法吗?感谢您的理解,我为此付出了很多努力。
答案 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
不会对您的文件执行任何操作(因为在许多情况下都需要这样做)。您需要积极地修改文件的内容,因为答案是正确的。
最后的注意事项:此代码非常简单。例如,它仅适用于没有组的文件。如果您想更笼统,则必须包括一些检查。