标签: hdf5

从HDF5文件中删除信息

我意识到一个SO用户以前曾问过这个问题,但在2009年被问到,我希望有更多关于HDF5的知识,或者新版本已经修复了这个特定问题.在此重申有关我自己问题的问题;

我有一个巨大的几何节点和元素文件,并且已经从中检索了我需要的所有有用信息.因此,在Python中,我试图保留原始文件,但删除我不需要的信息并填写其他来源的更多信息.例如,我有一个我不需要的节点数据集.但是,我需要保留相邻数据集,并从外部文件中包含有关其索引的信息.有没有办法删除这些特定的数据集?

或者,在HDF5文件中保留"放置管理员"的旧想法仍然是正确的,这样就没有人知道删除信息是多么困难?我不太担心空白区域,只要简单地删除和添加信息然后创建一个全新的文件就更快了.

注意:我正在使用H5py的'r +'进行读写.

python hdf5

16
推荐指数
1
解决办法
7491
查看次数

如何获得比numpy.dot更快的代码用于矩阵乘法?

这里使用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)

python numpy hdf5 matrix-multiplication pytables

16
推荐指数
1
解决办法
2万
查看次数

'/'在HDF5文件名称中混淆

我在h5py,PyTables(通过Pandas)和C++生成的HDF5文件之间经历了一些非常奇怪的交互.似乎h5checkh5py似乎应对包含'/'的类型名称,但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)

python hdf5 pytables h5py pandas

16
推荐指数
1
解决办法
1508
查看次数

Pandas无法读取使用h5py创建的hdf5文件

当我尝试读取用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)

非常感谢,玛莎

python hdf5 h5py pandas

16
推荐指数
1
解决办法
1万
查看次数

如何最好地将std :: vector <std :: string>容器写入HDF5数据集?

给定一个字符串向量,将它们写入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)

c++ stl hdf5

15
推荐指数
2
解决办法
8877
查看次数

在Matlab和R之间共享大型数据集

我需要一种相对有效的方法来在Matlab和R之间共享数据.

我已经检查了SaveRMATLAB R-link,但SaveR首先将 Matlab的二进制数据格式化为文本字符串,然后将它们打印到ASCII文件,这对大型数据集效率不高,而MATLAB R-link仅适用于Windows(它使用的是基于COM的界面).

更新:

Dirk发布了一个比SaveRMatlab R-link更好解决这个问题的列表.我最近也了解了RAM磁盘(参见此处这里的一些实现示例),并认为它们可能会促进在Matlab和R(或类似计算环境)之间共享大型数据集的任务.这引出了以下问题:

假设数据适合Matlab或R的本机数据容器中的机器内存:

  1. 到目前为止列出的任何解决方案是否更适合RAM磁盘?

  2. 在处理RAM磁盘而不是使用secundary-storage解决方案时,是否还需要考虑其他因素?

谢谢!

matlab r hdf5 ramdisk

15
推荐指数
1
解决办法
3170
查看次数

matplotlib - 从一个矩形阵列的高度的3d表面

我试图在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)元组,但也许不需要它?

python 3d matplotlib hdf5 geometry-surface

15
推荐指数
1
解决办法
2万
查看次数

如何通过h5py读取v7.3 mat文件?

我有一个由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 matlab hdf5 h5py mat

15
推荐指数
1
解决办法
1万
查看次数

如何用h5py区分HDF5数据集和组?

我使用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文件时,如何区分组和数据集?如何获取所有链接中所有组的所有数据集的列表?

python hdf5 h5py

15
推荐指数
2
解决办法
9929
查看次数

在 M1 Mac 上找不到 PyTables 的 HDF5 安装

在 M1 Mac、macOS Monterey 上运行12.4Python 3.10.3

\n

pip install tables

\n
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)

homebrew hdf5 pytables

15
推荐指数
2
解决办法
9918
查看次数