我意识到一个SO用户以前曾问过这个问题,但在2009年被问到,我希望有更多关于HDF5的知识,或者新版本已经修复了这个特定问题.在此重申有关我自己问题的问题;
我有一个巨大的几何节点和元素文件,并且已经从中检索了我需要的所有有用信息.因此,在Python中,我试图保留原始文件,但删除我不需要的信息并填写其他来源的更多信息.例如,我有一个我不需要的节点数据集.但是,我需要保留相邻数据集,并从外部文件中包含有关其索引的信息.有没有办法删除这些特定的数据集?
或者,在HDF5文件中保留"放置管理员"的旧想法仍然是正确的,这样就没有人知道删除信息是多么困难?我不太担心空白区域,只要简单地删除和添加信息然后创建一个全新的文件就更快了.
注意:我正在使用H5py的'r +'进行读写.
这里使用hdf5的矩阵乘法我使用hdf5(pytables)进行大矩阵乘法,但我很惊讶因为使用hdf5它的工作速度更快,然后在RAM中使用普通的numpy.dot和存储矩阵,这种行为的原因是什么?
也许在python中有一些更快的矩阵乘法函数,因为我仍然使用numpy.dot进行小块矩阵乘法.
这是一些代码:
假设矩阵可以适合RAM:在矩阵10*1000 x 1000上进行测试.
使用默认numpy(我认为没有BLAS lib).普通的numpy数组在RAM中:时间9.48
如果A,B在RAM中,C在磁盘上:时间1.48
如果磁盘上的A,B,C:时间372.25
如果我使用numpy与MKL结果是:0.15,0.45,43.5.
结果看起来很合理,但我仍然不明白为什么在第一种情况下块乘法更快(当我们将A,B存储在RAM中时).
n_row=1000
n_col=1000
n_batch=10
def test_plain_numpy():
A=np.random.rand(n_row,n_col)# float by default?
B=np.random.rand(n_col,n_row)
t0= time.time()
res= np.dot(A,B)
print (time.time()-t0)
#A,B in RAM, C on disk
def test_hdf5_ram():
rows = n_row
cols = n_col
batches = n_batch
#using numpy array
A=np.random.rand(n_row,n_col)
B=np.random.rand(n_col,n_row)
#settings for all hdf5 files
atom = tables.Float32Atom() #if store uint8 less memory?
filters = tables.Filters(complevel=9, complib='blosc') # tune parameters
Nchunk = 128 # ?
chunkshape = (Nchunk, …Run Code Online (Sandbox Code Playgroud) 我在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) 当我尝试读取用h5py创建的HDF5格式文件时,我得到了pandas错误.我想知道我是不是做错了什么?
import h5py
import numpy as np
import pandas as pd
h5_file = h5py.File('test.h5', 'w')
h5_file.create_dataset('zeros', data=np.zeros(shape=(3, 5)), dtype='f')
h5_file.close()
pd_file = pd.read_hdf('test.h5', 'zeros')
Run Code Online (Sandbox Code Playgroud)
给出错误:TypeError:如果对象不存在也没有传递值,则无法创建存储器
我尝试将密钥集指定为'/ zeros'(就像我在阅读文件时使用h5py一样)而没有运气.
如果我使用pandas.HDFStore读取它,我会得到一个空的商店:
store = pd.HDFStore('test.h5')
>>> store
<class 'pandas.io.pytables.HDFStore'>
File path: test.h5
Empty
Run Code Online (Sandbox Code Playgroud)
用h5py读取刚刚创建的文件没有麻烦:
h5_back = h5py.File('test.h5', 'r')
h5_back['/zeros']
<HDF5 dataset "zeros": shape (3, 5), type "<f4">
Run Code Online (Sandbox Code Playgroud)
使用这些版本:
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
pd.__version__
'0.16.2'
h5py.__version__
'2.5.0'
Run Code Online (Sandbox Code Playgroud)
非常感谢,玛莎
给定一个字符串向量,将它们写入HDF5数据集的最佳方法是什么?目前我做的事情如下:
const unsigned int MaxStrLength = 512;
struct TempContainer {
char string[MaxStrLength];
};
void writeVector (hid_t group, std::vector<std::string> const & v)
{
//
// Firstly copy the contents of the vector into a temporary container
std::vector<TempContainer> tc;
for (std::vector<std::string>::const_iterator i = v.begin ()
, end = v.end ()
; i != end
; ++i)
{
TempContainer t;
strncpy (t.string, i->c_str (), MaxStrLength);
tc.push_back (t);
}
//
// Write the temporary container to a dataset
hsize_t dims[] = { tc.size () …Run Code Online (Sandbox Code Playgroud) 我需要一种相对有效的方法来在Matlab和R之间共享数据.
我已经检查了SaveR和MATLAB R-link,但SaveR首先将 Matlab的二进制数据格式化为文本字符串,然后将它们打印到ASCII文件,这对大型数据集效率不高,而MATLAB R-link仅适用于Windows(它使用的是基于COM的界面).
Dirk发布了一个比SaveR和Matlab R-link更好解决这个问题的列表.我最近也了解了RAM磁盘(参见此处和这里的一些实现示例),并认为它们可能会促进在Matlab和R(或类似计算环境)之间共享大型数据集的任务.这引出了以下问题:
假设数据适合Matlab或R的本机数据容器中的机器内存:
到目前为止列出的任何解决方案是否更适合RAM磁盘?
在处理RAM磁盘而不是使用secundary-storage解决方案时,是否还需要考虑其他因素?
谢谢!
我试图在matplotlib中绘制一些HDF数据.使用h5py导入它们后,数据以数组的形式存储,如下所示:
array([[151, 176, 178],
[121, 137, 130],
[120, 125, 126])
Run Code Online (Sandbox Code Playgroud)
在这种情况下,x和y值只是数组字段的索引,而z值是特定字段的值.在(x,y,z)形式中,它看起来像:
(1,1,151)
(2,1,176)
(3,1,178)
(1,2,121)
...
Run Code Online (Sandbox Code Playgroud)
等等.
有没有一种简单的方法从这种数据做表面图?我知道我可以通过迭代整个数组将其改为(x,y,z)元组,但也许不需要它?
我有一个由matlab创建的struct数组,并存储在v7.3格式的mat文件中:
struArray = struct('name', {'one', 'two', 'three'},
'id', {1,2,3},
'data', {[1:10], [3:9], [0]})
save('test.mat', 'struArray', '-v7.3')
Run Code Online (Sandbox Code Playgroud)
现在我想通过python使用h5py读取这个文件:
data = h5py.File('test.mat')
struArray = data['/struArray']
Run Code Online (Sandbox Code Playgroud)
我不知道如何逐个获取结构数据struArray:
for index in range(<the size of struArray>):
elem = <the index th struct in struArray>
name = <the name of elem>
id = <the id of elem>
data = <the data of elem>
Run Code Online (Sandbox Code Playgroud) 我使用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文件时,如何区分组和数据集?如何获取所有链接中所有组的所有数据集的列表?
在 M1 Mac、macOS Monterey 上运行12.4,Python 3.10.3
pip install tables
Collecting tables\n Using cached tables-3.7.0.tar.gz (8.2 MB)\n Installing build dependencies ... done\n Getting requirements to build wheel ... error\n error: subprocess-exited-with-error\n \n \xc3\x97 Getting requirements to build wheel did not run successfully.\n \xe2\x94\x82 exit code: 1\n \xe2\x95\xb0\xe2\x94\x80> [12 lines of output]\n /var/folders/6g/9c7g_2tx2sb7lp8ttwtfky640000gn/T/H5closew_79lujq.c:2:5: error: implicit declaration of function \'H5close\' is invalid in C99 [-Werror,-Wimplicit-function-declaration]\n H5close();\n ^\n 1 error generated.\n cpuinfo failed, assuming no CPU features: No module …Run Code Online (Sandbox Code Playgroud)