我使用Python包h5py(版本2.5.0)来访问我的hdf5文件.
我想遍历文件的内容并对每个数据集执行某些操作.
使用visit
方法:
import h5py
def print_it(name):
dset = f[name]
print(dset)
print(type(dset))
with h5py.File('test.hdf5', 'r') as f:
f.visit(print_it)
Run Code Online (Sandbox Code Playgroud)
对于我获得的测试文件:
<HDF5 group "/x" (1 members)>
<class 'h5py._hl.group.Group'>
<HDF5 dataset "y": shape (100, 100, 100), type "<f8">
<class 'h5py._hl.dataset.Dataset'>
Run Code Online (Sandbox Code Playgroud)
这告诉我文件中有一个数据集和一个组.然而,除了用于type()
区分数据集和组之外,没有明显的方法.遗憾的是,h5py文档没有说明这个主题.他们总是假设您事先知道什么是组以及数据集是什么,例如因为他们自己创建了数据集.
我希望有类似的东西:
f = h5py.File(..)
for key in f.keys():
x = f[key]
print(x.is_group(), x.is_dataset()) # does not exist
Run Code Online (Sandbox Code Playgroud)
在使用h5py读取Python中的未知hdf5文件时,如何区分组和数据集?如何获取所有链接中所有组的所有数据集的列表?
我有一个大的hdf5文件,看起来像这样:
A/B/dataset1, dataset2
A/C/dataset1, dataset2
A/D/dataset1, dataset2
A/E/dataset1, dataset2
Run Code Online (Sandbox Code Playgroud)
...
我想创建一个仅包含以下内容的新文件:A/B/dataset1,dataset2 A/C/dataset1,dataset2
python中最简单的方法是什么?
我做了:
fs = h5py.File('source.h5', 'r')
fd = h5py.File('dest.h5', 'w')
fs.copy('group B', fd)
Run Code Online (Sandbox Code Playgroud)
问题是我得到了dest.h5:
B/dataset1, dataset2
Run Code Online (Sandbox Code Playgroud)
并且我遗漏了一部分树枝.
我在Ubuntu 12.04(32位版本)下使用Anaconda作为Python发行版并在ipython笔记本中编写,显然创建了一个没有任何问题的HDF5文件.底层数据都是numpy数组.例如,
import numpy as np
import h5py
f = h5py.File('myfile.hdf5','w')
group = f.create_group('a_group')
group.create_dataset(name='matrix', data=np.zeros((10, 10)), chunks=True, compression='gzip')
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试从新的iypthon笔记本打开此文件,我会收到一条错误消息:
f = h5py.File('myfile.hdf5', "r")
---------------------------------------------------------------------------
IOError Traceback (most recent call last)
<ipython-input-4-b64ac5089cd4> in <module>()
----> 1 f = h5py.File(file_name, "r")
/home/sarah/anaconda/lib/python2.7/site-packages/h5py/_hl/files.pyc in __init__(self, name, mode, driver, libver, userblock_size, **kwds)
220
221 fapl = make_fapl(driver, libver, **kwds)
--> 222 fid = make_fid(name, mode, userblock_size, fapl)
223
224 Group.__init__(self, fid)
/home/sarah/anaconda/lib/python2.7/site-packages/h5py/_hl/files.pyc in make_fid(name, mode, userblock_size, fapl, fcpl)
77
78 if mode == …
Run Code Online (Sandbox Code Playgroud) 有没有人想从h5py更新hdf5数据集?假设我们创建了一个数据集,如:
import h5py
import numpy
f = h5py.File('myfile.hdf5')
dset = f.create_dataset('mydataset', data=numpy.ones((2,2),"=i4"))
new_dset_value=numpy.zeros((3,3),"=i4")
Run Code Online (Sandbox Code Playgroud)
是否可以将dset扩展为3x3 numpy阵列?
在我们的实验室中,我们hdf5
通过python包将数据存储在文件中h5py
.
在实验开始时,我们在hdf5
文件中的数组数组(以及其他内容)之后创建文件和存储数组.当实验失败或被中断时,文件未正确关闭.因为我们的实验从iPython
对数据对象的引用运行在内存中(某处).
有没有办法扫描所有打开的h5py数据对象并关闭它们?
这是一个示例数据框:
import pandas as pd
NaN = float('nan')
ID = [1, 2, 3, 4, 5, 6, 7]
A = [NaN, NaN, NaN, 0.1, 0.1, 0.1, 0.1]
B = [0.2, NaN, 0.2, 0.2, 0.2, NaN, NaN]
C = [NaN, 0.5, 0.5, NaN, 0.5, 0.5, NaN]
columns = {'A':A, 'B':B, 'C':C}
df = pd.DataFrame(columns, index=ID)
df.index.name = 'ID'
print(df)
A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 …
Run Code Online (Sandbox Code Playgroud) 目前,我正在使用h5py生成hdf5数据集.我有类似的东西
import h5py
import numpy as np
my_data=np.genfromtxt("/tmp/data.csv",delimiter=",",dtype=None,names=True)
myFile="/tmp/f.hdf"
with h5py.File(myFile,"a") as f:
dset = f.create_dataset('%s/%s'%(vendor,dataSet),data=my_data,compression="gzip",compression_opts=9)
Run Code Online (Sandbox Code Playgroud)
这适用于相对较大的ASCII文件(400MB).我想对更大的数据集(40GB)做同样的事情.使用h5py有更好或更有效的方法吗?我想避免将整个数据集加载到内存中.
有关数据的一些信息:
dtype=None
从np.loadtxt()
我在这里有点困惑:
据我所知,h5py的.value
方法读取整个数据集并将其转储到一个数组中,这个数组很慢而且不鼓励(通常应该替换为[()]
.正确的方法是使用numpy-esque切片.
但是,我得到了令人不快的结果(使用h5py 2.2.1):
import h5py
import numpy as np
>>> file = h5py.File("test.hdf5",'w')
# Just fill a test file with a numpy array test dataset
>>> file["test"] = np.arange(0,300000)
# This is TERRIBLY slow?!
>>> file["test"][range(0,300000)]
array([ 0, 1, 2, ..., 299997, 299998, 299999])
# This is fast
>>> file["test"].value[range(0,300000)]
array([ 0, 1, 2, ..., 299997, 299998, 299999])
# This is also fast
>>> file["test"].value[np.arange(0,300000)]
array([ 0, 1, 2, ..., 299997, 299998, 299999])
# This …
Run Code Online (Sandbox Code Playgroud) 我试图使用HDF5数据格式存储大约3000个numpy数组.数组长度从5306到121999 np.float64不等
我收到
Object dtype dtype('O') has no native HDF5 equivalent
错误,因为数据的不规则性numpy使用一般对象类.
我的想法是将所有数组填充到121999长度并将大小存储在另一个数据集中.
然而,这似乎在太空中效率很低,有更好的方法吗?
编辑:澄清一下,我想存储3126个数组dtype = np.float64
.我将它们存储在a中,list
并且当h5py执行例程时它将转换为数组,dtype = object
因为它们的长度不同.为了说明它:
a = np.array([0.1,0.2,0.3],dtype=np.float64)
b = np.array([0.1,0.2,0.3,0.4,0.5],dtype=np.float64)
c = np.array([0.1,0.2],dtype=np.float64)
arrs = np.array([a,b,c]) # This is performed inside the h5py call
print(arrs.dtype)
>>> object
print(arrs[0].dtype)
>>> float64
Run Code Online (Sandbox Code Playgroud) 我正在使用带有TensorFlow后端的Keras在Google Cloud Machine Learning Engine上培训LSTM网络.在对gcloud和我的python脚本进行一些调整之后,我设法部署我的模型并执行成功的训练任务.
然后我尝试使用Keras modelCheckpoint回调使我的模型在每个纪元后保存检查点.使用Google Cloud运行本地培训工作可以完美地按预期运行.在每个纪元之后,权重将存储在指定的路径中.但是,当我尝试在Google云端机器学习引擎上在线运行相同的工作时weights.hdf5
,不会将其写入我的Google Cloud Bucket.相反,我收到以下错误:
...
File "h5f.pyx", line 71, in h5py.h5f.open (h5py/h5f.c:1797)
IOError: Unable to open file (Unable to open file: name =
'gs://.../weights.hdf5', errno = 2, error message = 'no such file or
directory', flags = 0, o_flags = 0)
Run Code Online (Sandbox Code Playgroud)
我调查了这个问题,事实证明,Bucket本身没有问题,因为Keras Tensorboard回调确实正常工作并将预期输出写入同一个存储桶.我还确保h5py
通过在以下setup.py
位置提供它来包含它:
??? setup.py
??? trainer
??? __init__.py
??? ...
Run Code Online (Sandbox Code Playgroud)
实际包含setup.py
如下所示:
# setup.py
from setuptools import setup, find_packages
setup(name='kerasLSTM',
version='0.1',
packages=find_packages(), …
Run Code Online (Sandbox Code Playgroud)