我试图将一个可变长度的字符串列表存储到HDF5数据集.这个代码是
import h5py
h5File=h5py.File('xxx.h5','w')
strList=['asas','asas','asas']
h5File.create_dataset('xxx',(len(strList),1),'S10',strList)
h5File.flush()
h5File.Close()
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,指出"TypeError:没有dtype的转换路径:dtype('< U3')"其中<表示实际小于符号
我该如何解决这个问题.
HDFVIEW相当不错,但还有其他选择吗?
能够改变诸如分块/压缩设置之类的东西会很棒 - hdfview没有这个功能 - 无需使用Java/python /其他任何东西来加载文件.
我正在尝试使用One Million Song数据集,为此我必须安装python表,numpy,cython,hdf5,numexpr等等.
昨天我设法安装了我需要的所有东西,在遇到hdf5的麻烦之后,我下载了预编译的二进制包并将它们保存在我的/ bin文件夹中,以及/ lib中的各个库,之后我测试了这个python脚本: http://labrosa.ee.columbia.edu/millionsong/sites/default/files/tutorial1.py.txt
它工作得很好,要清楚我的工作方式是首先运行脚本并开始安装所需的依赖项,但今天我重新启动了我的笔记本电脑并且它不起作用,现在它在控制台上抛出了这个错误:
python2.7 script.py
Run Code Online (Sandbox Code Playgroud)
回报:
import numpy as np # get it at: http://numpy.scipy.org/
from . import random
from .mtrand import *
ImportError: /home/francisco/.local/lib/python2.7/site-packages/numpy/random/mtrand.so: undefined symbol: PyFPE_jbuf
Run Code Online (Sandbox Code Playgroud)
在我看来,在这样的文件中有一个缺失的变量,我的猜测是脚本正在寻找错误位置的numpy库,因为我做了这么多失败的安装,也许我打破了一些东西,它只是因为它被加载了在计算机的时间记忆中.
我尝试安装Anaconda,我创建了一个新的环境并安装了与anaconda包管理器一起打包,甚至认为我列出了所有打包并返回:
# packages in environment at /home/francisco/anaconda2/envs/Music:
#
biopython 1.66 np110py27_0
cython 0.23.4 <pip>
hdf5 1.8.15.1 2
mkl 11.3.1 0
numexpr 2.5 np110py27_0
numpy 1.10.4 py27_1
openssl 1.0.2g 0
pillow 3.1.1 <pip>
pip 8.1.1 py27_0
pytables 3.2.2 np110py27_1
python 2.7.11 0
python-ldap 2.4.25 <pip>
readline 6.2 …Run Code Online (Sandbox Code Playgroud) 我试图理解hdf5并发的限制.
有两个版本的hdf5:并行HDF5和默认值.并行版本目前在Ubuntu中提供,默认在Anaconda中(由"--enable-parallel"标志判断).
我知道并行写入同一个文件是不可能的.但是,我不完全理解默认情况下或使用并行构建可以扩展以下操作:
此外,有没有任何理由anaconda默认没有--enable-parallel标志?(https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh)
有没有办法从hdf5文件中删除数据集,最好是使用h5py?或者,是否可以覆盖数据集,同时保持其他数据集完好无损?
据我了解,h5py可以在5种模式下读/写hdf5文件
f = h5py.File("filename.hdf5",'mode')
Run Code Online (Sandbox Code Playgroud)
其中mode可以r用于读取,r+用于读写,a用于读写但是如果不存在则创建新文件,w用于写/覆盖, 如果文件已经存在,则该文件w-相同w但失败.我尝试了所有但似乎没有工作.
任何建议都非常感谢.
我正在处理文件数量,文件的每个处理将输出几千个浮点数组,我将所有文件的数据存储在一个大型数据集中的单个hdf5中,以便进一步处理.
目前我很困惑如何将我的数据附加到hdf5文件中.(在上面的代码中注释)在上面的2个for循环中,正如你所看到的,我想一次将1维float数组追加到hdf5中,而不是整个东西.我的数据是以TB为单位,我们只能将数据附加到文件中.
有几个问题:
或者这不可能吗?
编辑:
我一直在关注Simon的建议,目前这里是我的更新代码:
hid_t desFi5;
hid_t fid1;
hid_t propList;
hsize_t fdim[2];
desFi5 = H5Fcreate(saveFilePath, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
fdim[0] = 3;
fdim[1] = 1;//H5S_UNLIMITED;
fid1 = H5Screate_simple(2, fdim, NULL);
cout << "----------------------------------Space done\n";
propList = H5Pcreate( H5P_DATASET_CREATE);
H5Pset_layout( propList, H5D_CHUNKED );
int ndims = 2;
hsize_t chunk_dims[2];
chunk_dims[0] = 3;
chunk_dims[1] = 1;
H5Pset_chunk( propList, ndims, chunk_dims );
cout << "----------------------------------Property done\n";
hid_t dataset1 = H5Dcreate( desFi5, "des", H5T_NATIVE_FLOAT, fid1, …Run Code Online (Sandbox Code Playgroud) 在python2.7,我可以分析一个hdf5文件密钥使用
$ python
>>> import h5py
>>> f = h5py.File('example.h5', 'r')
>>> f.keys()
[u'some_key']
Run Code Online (Sandbox Code Playgroud)
然而,在python3.4,我得到了一些不同的东西:
$ python3 -q
>>> import h5py
>>> f = h5py.File('example.h5', 'r')
>>> f.keys()
KeysViewWithLock(<HDF5 file "example.h5" (mode r)>)
Run Code Online (Sandbox Code Playgroud)
是什么KeysViewWithLock,以及如何在Python3中检查我的HDF5密钥?
我正在设置一个TensorFlow管道,用于读取大型HDF5文件作为我的深度学习模型的输入.每个HDF5文件包含100个可变大小长度的视频,存储为压缩JPG图像的集合(以使磁盘上的大小可管理).使用tf.data.Dataset和映射tf.py_func,使用自定义Python逻辑从HDF5文件中读取示例非常简单.例如:
def read_examples_hdf5(filename, label):
with h5py.File(filename, 'r') as hf:
# read frames from HDF5 and decode them from JPG
return frames, label
filenames = glob.glob(os.path.join(hdf5_data_path, "*.h5"))
labels = [0]*len(filenames) # ... can we do this more elegantly?
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.map(
lambda filename, label: tuple(tf.py_func(
read_examples_hdf5, [filename, label], [tf.uint8, tf.int64]))
)
dataset = dataset.shuffle(1000 + 3 * BATCH_SIZE)
dataset = dataset.batch(BATCH_SIZE)
iterator = dataset.make_one_shot_iterator()
next_batch = iterator.get_next()
Run Code Online (Sandbox Code Playgroud)
这个例子有效,但问题是它似乎tf.py_func一次只能处理一个例子.由于我的HDF5容器存储了100个示例,因此这种限制会导致显着的开销,因为文件经常需要打开,读取,关闭和重新打开.将所有100个视频示例读入数据集对象然后继续使用下一个HDF5文件(最好是在多个线程中,每个线程处理它自己的HDF5文件集合)会更有效率.
所以,我想要的是在后台运行的一些线程,从HDF5文件中读取视频帧,从JPG解码它们,然后将它们提供给数据集对象.在引入tf.data.Dataset管道之前,使用 …
从HDF5商店中的表格中选择内容没有问题:
with pandas.HDFStore(data_store) as hdf:
df_reader = hdf.select('my_table_id', chunksize=10000)
Run Code Online (Sandbox Code Playgroud)
如何获取使用pandas选择的所有表的列表?
我在h5py,PyTables(通过Pandas)和C++生成的HDF5文件之间经历了一些非常奇怪的交互.似乎h5check和h5py似乎应对包含'/'的类型名称,但pandas/PyTables不能.显然,我的理解存在差距,因此:
我在这里有什么不明白的?
血淋淋的细节
我在HDF5文件中有以下数据:
[...]
DATASET "log" {
DATATYPE H5T_COMPOUND {
H5T_COMPOUND {
H5T_STD_U32LE "sec";
H5T_STD_U32LE "usec";
} "time";
H5T_IEEE_F32LE "CIF/align/aft_port_end/extend_pressure";
[...]
Run Code Online (Sandbox Code Playgroud)
这是通过C++ API创建的.该h5check公用事业说,文件是有效的.
请注意,这CIF/align/aft_port_end/extend_pressure 并不是指组/节点/叶子的路径.它是一个标签,我们在内部使用,恰好有一些内部结构包含'/'作为分隔符.我们不希望HDF5文件对此有所了解:它不应该关心.显然,如果'/'在任何HDF5名称中都是非法的,那么我们必须将该分隔符更改为其他名称.
使用PyTables(好吧,Pandas但它在内部使用PyTables)来读取文件,我得到了一个
>>> import pandas as pd
>>> store = pd.HDFStore('data/XXX-20150423-071618.h5')
>>> store
/home/XXX/virt/env/develop/lib/python2.7/site-packages/tables/group. py:1156: UserWarning: problems loading leaf ``/log``::
the ``/`` character is not …Run Code Online (Sandbox Code Playgroud)