【问题标题】:Read or Write a compound datatype with h5py in python在 python 中使用 h5py 读取或写入复合数据类型
【发布时间】:2015-09-27 00:02:00
【问题描述】:

我想在一些 C++、matlab 和 python 代码中使用 hdf5 文件。 我的 h5 文件在 C++ 和 matlab 中运行良好,但不能用 h5py 读取。

h5py 是否不支持 H5T_STD_B64LE 等数据类型? 谢谢!

In [2]: f = h5py.File('art.mips.log.h5', 'r')

In [3]: f.keys()
Out[3]: [u'mem']

In [4]: f['mem']
Out[4]: <repr(<h5py._hl.dataset.Dataset at 0x29f70d0>) failed: TypeError: No NumPy equivalent for TypeBitfieldID exists>

hdf5文件格式如下:

$ h5dump -H art.mips.log.h5  
HDF5 "art.mips.log.h5" { GROUP "/" {    DATASET "mem" {
      DATATYPE  H5T_COMPOUND {
         H5T_STD_B64LE "clock";
         H5T_STD_B32LE "addr";
         H5T_STD_B32LE "operation";
         H5T_ARRAY { [16] H5T_STD_B32LE } "data";
      }
      DATASPACE  SIMPLE { ( 68614468 ) / ( H5S_UNLIMITED ) }
      ATTRIBUTE "CLASS" {
         DATATYPE  H5T_STRING {
            STRSIZE 6;
            STRPAD H5T_STR_NULLTERM;
            CSET H5T_CSET_ASCII;
            CTYPE H5T_C_S1;
         }
         DATASPACE  SCALAR
      }
      ATTRIBUTE "FIELD_0_NAME" {
         DATATYPE  H5T_STRING {
            STRSIZE 6;
            STRPAD H5T_STR_NULLTERM;
            CSET H5T_CSET_ASCII;
            CTYPE H5T_C_S1;
         }
         DATASPACE  SCALAR
      }
      ATTRIBUTE "FIELD_1_NAME" {
         DATATYPE  H5T_STRING {
            STRSIZE 5;
            STRPAD H5T_STR_NULLTERM;
            CSET H5T_CSET_ASCII;
            CTYPE H5T_C_S1;
         }
         DATASPACE  SCALAR
      }
      ATTRIBUTE "FIELD_2_NAME" {
         DATATYPE  H5T_STRING {
            STRSIZE 10;
            STRPAD H5T_STR_NULLTERM;
            CSET H5T_CSET_ASCII;
            CTYPE H5T_C_S1;
         }
         DATASPACE  SCALAR
      }
      ATTRIBUTE "FIELD_3_NAME" {
         DATATYPE  H5T_STRING {
            STRSIZE 5;
            STRPAD H5T_STR_NULLTERM;
            CSET H5T_CSET_ASCII;
            CTYPE H5T_C_S1;
         }
         DATASPACE  SCALAR
      }
      ATTRIBUTE "TITLE" {
         DATATYPE  H5T_STRING {
            STRSIZE 4;
            STRPAD H5T_STR_NULLTERM;
            CSET H5T_CSET_ASCII;
            CTYPE H5T_C_S1;
         }
         DATASPACE  SCALAR
      }
      ATTRIBUTE "VERSION" {
         DATATYPE  H5T_STRING {
            STRSIZE 4;
            STRPAD H5T_STR_NULLTERM;
            CSET H5T_CSET_ASCII;
            CTYPE H5T_C_S1;
         }
         DATASPACE  SCALAR
      }
   }
}
}

【问题讨论】:

  • 如果您提供了一个示例 .h5 文件(或者至少包含了 h5import 的配置文件,以便于使用示例数据集进行试验;请参阅 hdfgroup.org/HDF5/Tutor/cmdtoolcvrt.html#h5import )。
  • @Phil 这是一个包含所有内容的示例文件 one drive link 。实际上我在h5py mail list 中粘贴了同样的问题,并且安德鲁建议我进行类型转换。没试过,也想知道怎么用python写成同样格式的h5文件,让其他源码不用修改代码就可以读出来。
  • 你的问题很清楚,但我不知道答案。我尝试按照 Andrew 在邮件列表中的建议使用 astype,并得到“IOError:无法读取数据(转换路径没有适当的功能)”。如果您能够更改编写器,我建议您将数据打包成 uint8 值而不是位。
  • @Phil,实际上这就是我现在正在做的事情,但是,它需要对几种不同类型的源代码进行更改。当文件以 C 代码生成时,我不应该使用“H5T_NATIVE_B*”类型。谢谢!

标签: hdf5 h5py


【解决方案1】:

h5py 不支持位域,如https://github.com/h5py/h5py/issues/109中所述

我快速浏览了 h5py 中的低级接口,看看是否有办法获取原始数据,但看起来底层的 id 对象需要支持 read() 方法。

>>> mem_id = h5py.h5o.get_info(f.id, 'mem')
>>> mem_id.read
...
AttributeError: 'h5py.h5o.ObjInfo' object has no attribute 'read'

【讨论】:

  • 没错,目前还没有很好的解决方案。我将修改作者以避免此问题。
猜你喜欢
  • 1970-01-01
  • 2021-07-03
  • 2017-09-07
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 2015-05-06
相关资源
最近更新 更多