用h5py读取和解码hdf5字符串。

问题描述 投票:0回答:1

我有一个hdf5文件,其中包含一个sting,我希望使用h5py包将其读入python(2)中。

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个回答
0
投票

这个怎么样。

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

然后..:

print Data[0] # ?

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


0
投票

我对HDF5 C++语法不熟悉。看起来数据集 "Name "有一个名为 "L_1_3 "的字段,字段为String。有一个更简单的方法来获得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

上面的代码概述了从HDF5h5py数据集读取数据的基本步骤。下面是使用h5py数据集对象与NumPy数组时的额外注意事项。其中的一些内容在我对一个类似帖子的回复中进行了解释。链接在这里。对61464832的回答

很容易混淆h5py数据集对象和NumPy数组。从设计上看,它们有相似的行为,但它们是不一样的。两者都有一个形状和一个数据类型,都支持数组式的分片,并且可以和迭代器一起使用。这里有一个关键的区别。如果你把一个数据集读到一个数组中,你需要足够的内存来保存所有的数据。当你访问一个数据集对象时,你不需要把所有的数据读到内存中。. 当你访问庞大的数据集时,这一点至关重要。在我上面的例子中。Data 是一个数据集对象,而 Data_arr 是一个具有相同数据的NumPy数组。对于你的小数据集来说,内存使用并不重要。如果你的数据集很大,比如说(8000,3,1000,2000)个浮动数组,那就会有很大的不同。这几乎是48GB的值,这需要384GB的内存(如果我的计算正确的话)。

你可以在不创建数组的情况下进行许多 "类似数组 "的操作。唯一一次真正需要数组的时候是你需要使用一个需要数组输入的NumPy函数。

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

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]
© www.soinside.com 2019 - 2024. All rights reserved.