使用任意形状的pytables创建数组(或表)的行

时间:2015-03-18 01:44:23

标签: python-2.7 hdf5 pytables

我通过一个由python程序(主程序)处理的脚本执行第三方程序(为了简单起见,这里称为程序B)。为了让您全面了解我想要做的事情,这里有一个非常简化的主程序执行任务列表:

  1. 执行程序B并等待它完成。

  2. B完成后,它会读取由B存储到ASCII文件中的B输出。

  3. 将输出格式化为一维数组的集合,然后使用Pytables模块存储到HDF5文件中。

  4. 返回步骤1,为B使用一组新参数,直到退出条件为True。

  5. 我的问题在第3步.Pytables似乎处理了已知形状的表。就我而言,只有在执行B之后才知道B的输出的形状。从一次迭代到另一次迭代,我的输出形状各不相同。

    下面是我为处理B的固定形状输出而编写的代码,并使用stackoverflow中提供的一些解决方案来解决类似(但不完全相同)的问题。在我的情况下,这种解决方案并不令人满意,因为在这里,形状必须是不变的。 所以我的问题是,如果每行具有不同的形状,您将如何调整此代码?我在另一篇文章中看到了一些可能性(In PyTables, how to create nested array of variable length?),但我还不熟悉EArray,VLArray。此外,它似乎不是真正有效的方法。

    def makemytable1D(filepointer, group, tablename, labels, shapes):
        #Declare the dictionary
        template = {}
        # make all columns
        for i in np.arange(len(labels)):
            template[labels[i]]=tables.Float64Col(shape=shapes[i], pos=i)
    
        table = filepointer.create_table(group,tablename,template)
        return table, template
    
    def fillmytable1D(table, labels, data, Ndata):
       tablerow=table.row
       for i in np.arange(Ndata):
           tablerow[labels[i]]=data[i]
       tablerow.append()
       table.flush()
    
    # ----------- Execution -----------
    import numpy as np
    import tables
    
    labels=np.array(['Field1','Field2','Field3','Field4','Field5']) # example of labels
    data=np.array([[0,1], [2,2,2,2], [3,3,3], [4,4], [5,5]]) # example of data
    shapes=[]
    for d in data:
        shapes.append(np.array(d).shape)
    Ndata=len(data)
    try:
       saveFile=tables.open_file('save.hdf','w')
       group=saveFile.create_group('/', 'group1', 'Model 1')
       tab, template=makemytable1D(saveFile, group, 'test', labels, shapes)
       for i in range(10): # The iteration. In my real life problem, data has a shape that varies at each iteration.The current example would not work here.
           fillmytable1D(tab, labels, data, Ndata)
    finally:
       saveFile.close()
    

0 个答案:

没有答案