代码之家  ›  专栏  ›  技术社区  ›  Socorro

Pytables-简单的h5数据

  •  0
  • Socorro  · 技术社区  · 2 年前

    我发现用pytables读取h5数据比我想象的要困难得多。

    我可以使用hdfview软件来查看我的h5文件实际上是几个2d表。这在我想在python中使用它们/将它们作为物理网格的一部分读入以进行处理的程度上是没有用的。

    我看过的文档似乎比我需要的要复杂得多。有没有一个简单的例子可以在一个有四个条目(“纬度、经度、fakeDim0、fakeDim1”)的文件中读取?

    我认为它类似于pandas.read_csv或等效物,我们只是“读入并得到一个表”。

    我错过了一些简单的东西吗?

    1 回复  |  直到 2 年前
        1
  •  0
  •   Dmitrii Malygin    2 年前

    这比pandas有点难,但也许要习惯它。有一些使用PyTables的例子可以让它更容易:

    import tables as tb
    
    with tb.open_file('your_file.h5', mode='r') as h5file:
        table = h5file.root.entry_name
        # 'entry_name' is name of your HDF5 file
        
        # read into a NumPy array
        data = table.read()
        
        # access the data columns by name
        latitude = data['Latitude']
        longitude = data['Longitude']
        dim0 = data['dim0']
        dim1 = data['dim1']
    
        2
  •  0
  •   kcw78    2 年前

    HDF5是一个容器,具有用户定义的数据模式。因此,访问数据取决于模式。需要一些背景知识。HDF5、PyTables和NumPy对其数据对象使用略有不同的术语。

    • HDF5将数据存储在“数据集”中。它们可以存储同质数据或 异构(有时称为复合)数据。异构数据对象仅限于二维形状。
    • PyTables有两种类型的存储类(对象类型):“数组”用于同构数据(实际上有4种类型的数组)。“表”用于结构化数据(异构或复合数据)。
    • NumPy数组还可以存储同构或异构数据。数据类型由dype属性定义。
    • 下表映射了包中的对象:
    HDF5 PyTables NumPy
    异质性 表格 shape=(Nrows,),dtype定义字段/列名
    同种类的 阵列 shape=任意,dytpe定义所有数据

    这就是为什么需要更多信息来编写特定于您的文件的代码。不同的PyTables函数用于访问同构和异构数据集,返回的NumPy对象略有不同。

    下面的代码从两个非常简单的文件中创建和读取数据。第一个代码段创建2个HDF5文件:第一个有1个异构/复合数据集( _1ds.h5 ),第二个有4个同质数据集( _4ds.h5 ). 你不需要知道如何创建文件。只需运行它并在HDFView中查看文件,即可查看下面“读取”代码中使用的数据结构。选择与您的文件匹配的一个。

    创建以下文件的代码:

    # Create some data, saved in a recarray with field names from post
    names = ["Latitude", "Longitude", "fakeDim0", "fakeDim1"]
    arr_dt = np.dtype( {'names':names, 'formats':[float for _ in range(len(names))]} )
    recarr = np.empty(shape=(10,), dtype=arr_dt)
    recarr["Latitude"] = [10.*x for x in range(10)]
    recarr["Longitude"] = [-10.*x for x in range(10)]
    recarr["fakeDim0"] = [0.1*x for x in range(10)]
    recarr["fakeDim1"] = [0.2*x for x in range(10)]
     
    with tb.File('SO_75898559_1ds.h5','w') as h5f:  
        h5f.create_table('/','Example_Table',obj=recarr)
        
    with tb.File('SO_75898559_4ds.h5','w') as h5f:
         for name in names:
            #extract columns from recarray and save eaqch as seperate dataset
            data = recarr[name]
            h5f.create_array('/',name,obj=data)
    

    读取以下文件的代码:

    with tb.File('SO_75898559_1ds.h5','r') as h5f: 
        # use natural naming to define path to table 
        ex_table = h5f.root.Example_Table
        # OR use get_node()
        ex_table = h5f.get_node('/Example_Table')
        recarr = ex_table.read()
        print(f'For Table {ex_table._v_name}; np.array type = {type(recarr)}')
        print(f'\tTable shape = {recarr.shape}')
        print(f'\tTable dtype = {recarr.dtype}')  
    
        # to get an array of data from a field/column of recarr:
        arr_lat = recarr["Latitude"]   
        # OR read from Table
        arr_lat = ex_table.read(field="Latitude")    
        print("\nLatitude data:\n",arr_lat)
    
        # to read data row-by-row from the table:
        print("\nrow data:")
        for row in ex_table:
            print([row[fname] for fname in ex_table.colnames])
    
    print()    
    with tb.File('SO_75898559_4ds.h5','r') as h5f:
        for dset in h5f.iter_nodes('/',classname='Array'):
            arr = dset.read()
            print(f'For Array {dset._v_name}; np.array type = {type(arr)}')
            print(f'\tArray shape = {arr.shape}')
            print(f'\tArray dtype = {arr.dtype}')