【问题标题】:Reading and decoding hdf5 string with h5py使用 h5py 读取和解码 hdf5 字符串
【发布时间】:2020-08-13 07:37:44
【问题描述】:

我有一个 hdf5 文件,其中包含我希望使用 h5py 包读入 python(2) 的字符串。 条目在 h5dump 中读取:

DATASET "Name" {
   DATATYPE  H5T_STRING {
      STRSIZE 5;
      STRPAD H5T_STR_NULLTERM;
      CSET H5T_CSET_UTF8;
      CTYPE H5T_C_S1;
   }
   DATASPACE  SCALAR
   DATA {
   (0): "L_1_3"
   }
}

我可以访问该文件并将数据提取为

import h5py
fp = h5py.File("myfile.hdf5","r")
Data=fp.get("Name")

打印Data 的内容会生成<HDF5 dataset "Name": shape (), type "|S5">。 如何提取字符串?

我使用np.array(Data) 对其进行解码的首选解决方案失败并显示消息IOError: Can't read data (no appropriate function for conversion path)

【问题讨论】:

    标签: python python-2.7 hdf5 h5py


    【解决方案1】:

    这个怎么样:

    import h5py
    fp = h5py.File("myfile.hdf5","r")
    Data = fp.get("Name")
    

    然后:

    print Data[0] # ?
    

    另外,您可以尝试检查len(Data) 以查看那里是否有任何数据。

    【讨论】:

      【解决方案2】:

      我不熟悉 HDF5 C++ 语法。看起来数据集“名称”有一个名为“L_1_3”的字段,带有一个字符串。有一种更简单的方法来获取 NumPy 数组(在处理大型数据集时更好)。我认为这将帮助您了解如何使用 HDF5 和 h5py。当您打印 dtype 时,您应该看到每个字段的名称。另外,我只使用 Python3,如果下面有任何语法错误,我深表歉意。

      import h5py
      fp = h5py.File("myfile.hdf5","r")
      Data = fp["Name"]  ## same as fp.get("Name")
      
      # To work with the h5py dataset object
      print Data.dtype, Data.shape
      print Data[0]["L_1_3"] ## to get the first row from dataset
      
      # To work with a NumPy array
      Data_arr = fp["Name"][:] ## Adding [:] returns a NumPy array.
      print Data_arr.dtype, Data_arr.shape
      print Data_arr[0][0] ## to get the first row from NumPy array
      # This notation might be required, depends on array dtype:
      print Data_arr[0]["L_1_3"] ## to get the first row from NumPy array
      

      上面的代码概述了从 HDF5/h5py 数据集读取数据的基本步骤。以下是使用 h5py 数据集对象与 NumPy 数组时的其他注意事项。其中一些在我对类似帖子的回复中进行了解释。链接在这里:Answer to 61464832

      很容易混淆 h5py 数据集对象和 NumPy 数组。按照设计,它们具有相似的行为,但它们并不相同。两者都有形状和数据类型,支持数组样式的切片,并且可以与迭代器一起使用。这是一个关键区别:如果将数据集读入数组,则需要足够的内存来保存所有数据。 当您访问数据集对象时,您不会将所有数据都读入内存。当您访问庞大的数据集时,这一点至关重要。在我上面的示例中,Data 是一个数据集对象,Data_arr 是一个具有相同数据的 NumPy 数组。内存使用与您的小数据集无关。如果您的数据集很大,例如 (8000, 3, 1000, 2000) 浮点数组,这会产生很大的不同。这几乎是 48GB 的​​值,需要 384GB 的内存(如果我的数学是正确的)。

      您可以在不创建数组的情况下执行许多“类似数组”的操作。唯一真正需要数组的时候是需要使用需要数组输入的 NumPy 函数。

      这里有一些示例展示了如何使用类似于 NumPy 数组的 Data 数据集。

      import h5py
      fp = h5py.File("myfile.hdf5","r")
      # iterate on rows in dataset "Name"
      # Note how an array does not need to created
      # could also use 'Data' object from above: Data = fp["Name"]  
      for row in fp["Name"] :
          print row
      # Slice the first row from the dataset
      firstrow_arr = fp["Name"][0]
      # Slice the last column from the dataset
      lastcol_arr = fp["Name"][:,-1]
      

      【讨论】:

        猜你喜欢
        • 2016-06-05
        • 2016-04-08
        • 2021-05-14
        • 2022-10-19
        • 2018-05-02
        • 2018-09-20
        • 2016-02-11
        • 2015-09-29
        相关资源
        最近更新 更多