我通过一个由python程序(主程序)处理的脚本执行第三方程序(为了简单起见,这里称为程序B)。为了让您全面了解我想要做的事情,这里有一个非常简化的主程序执行任务列表:
执行程序B并等待它完成。
B完成后,它会读取由B存储到ASCII文件中的B输出。
将输出格式化为一维数组的集合,然后使用Pytables模块存储到HDF5文件中。
返回步骤1,为B使用一组新参数,直到退出条件为True。
我的问题在第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()