【问题标题】:Automated creation of multiple datasets in Python-Pytables在 Python-Pytables 中自动创建多个数据集
【发布时间】:2021-01-31 11:22:33
【问题描述】:

在我的脚本中,我手动创建了几个数据集:

    import tables
    dset1 = f.create_earray(f.root, "dataset1", atom=tables.Float64Atom(), shape=(0, 2))
    dset2 = f.create_earray(f.root, "dataset2", atom=tables.Float64Atom(), shape=(0, 2))
    dset3 = f.create_earray(f.root, "dataset3", atom=tables.Float64Atom(), shape=(0, 2))
    ...

我想实现两件事:

  1. 自动执行上述语句以循环方式执行并创建任何所需的 (N) 数据集

  2. 然后我还按顺序使用.append 方法(如下所示),我也想自动化:

     dset1.append(np_array1) 
     dset2.append(np_array2) 
     dset3.append(np_array3) 
     ...
    

需要任何帮助吗?

【问题讨论】:

    标签: python-3.x numpy append data-science pytables


    【解决方案1】:

    如果没有更多细节,很难提供具体建议。如果您已经拥有 NumPy 数组,则可以在一次调用中使用数据创建 EArray(使用 obj= 参数)。这是一段小代码 sn-p,它显示了如何在循环中执行此操作。

    import tables as tb
    import numpy as np
    
    with tb.File('SO_64397597.h5','w') as h5f:
        
        arr1  = np.ones((10,2))
        arr2  = 2.*np.ones((10,2))
        arr3  = 3.*np.ones((10,2))
        arr_list = [arr1, arr2, arr3]
        for cnt in range(1,4):
            h5f.create_earray("/", "dataset"+str(cnt), obj=arr_list[cnt-1])
    

    上面的代码不会创建数据集对象。如果您需要它们,可以通过此调用以编程方式访问:

    # input where as path to node, name not required
    ds = h5f.get_node("/dataset1")
    # or
    # input where as path to group, and name as dataset name
    ds = h5f.get_node("/","dataset1") 
    

    如果您在创建数据集时没有数组,您可以在第一个循环中创建 EArray,然后在第二个循环中添加 np.array 数据。见下文:

    with tb.File('SO_64397597.h5','w') as h5f:
        
        for cnt in range(1,4):
            h5f.create_earray("/", "dataset"+str(cnt), atom=tables.Float64Atom(), shape=(0, 2))
    
            # get array data...
            arr_list = [arr1, arr2, arr3]
            # add array data
            for cnt in range(1,4):
                h5f.get_node("/","dataset"+str(cnt)).append(arr_list[cnt-1]) 
    

    【讨论】:

    • 太棒了。所以我在创建时没有数组,并且在你的答案的最后一个块(代码)之后。如何引用创建的数据集进行追加?例如,如果您查看我上面的问题,我将它们称为dset1dset2... 我尝试了name = f'dset{cnt}' 然后name = h5f.create_earray...,但没有奏效,有什么建议吗?
    • 如果您知道数据集名称,您可以使用h5f.get_node(where,name) 返回该名称的对象。 where 可以是完整路径(name 不是必需的)或where 可以是组路径,name 是必需的。这将获取名称为 dataset_{cnt} 的数据集:h5f.get_node("/","dataset"+str(cnt))
    猜你喜欢
    • 2022-01-19
    • 2021-04-18
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    相关资源
    最近更新 更多