使用 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
不会对你的文件做任何事情(在很多情况下都是想要的行为)。您需要主动修改文件的内容,就像这个答案所做的那样。
最后一点:这段代码非常简单。例如,它仅适用于没有组的文件。如果你想更笼统,你必须包括一些支票。
我有一个包含多个密钥的 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
不会对你的文件做任何事情(在很多情况下都是想要的行为)。您需要主动修改文件的内容,就像这个答案所做的那样。
最后一点:这段代码非常简单。例如,它仅适用于没有组的文件。如果你想更笼统,你必须包括一些支票。