如何为Pytables EArray创建定义atom

时间:2012-10-30 15:24:45

标签: python numpy pytables

尝试在运行中基于numpy recarray中的一列创建Pytables EArray。这似乎有效,如果我使用createArray,因为我可以简单地传递从recarray提取的numpy数组。但是,对于createEArray,我需要定义原子 - 这会导致问题

在示例中,MyRecArray是具有列的1-D数组的记录阵列,Myhdf5是预定义的Pytables文件,而Mynode是该文件中预定义的组,EArray将从该文件中保留。

     Myfield = MyRecArray[Colname]
     afieldtype = Myfield.dtype  
     Myatom = tables.atom.Atom(afieldtype, (1,), -9999) 
     MyEarray = Myhdf5.createEArray(Mynode, Colname, Myatom, (0,))
     MyEarray.append(Myfield )          
     MyEarray.flush()
     MyEarray.close()

使用此代码会出错:

     NotImplementedError: ``Atom`` is an abstract class; 
     please use one of its subclasses

我可以用基于数组时间的case语句编写一个子例程并传回一个原子,但我只是想知道是否有一种通用方法来创建这样一个原子,方法是将它传递给要创建的数组类型而不是必须为不同的数据类型调用特定的函数,例如“tables.atom.FloatAtom(....)”

由于

1 个答案:

答案 0 :(得分:1)

我相信使用这个功能:

tables.Atom.from_dtype(afieldtype, dflt=-9999)

将允许您在不执行子程序路径的情况下创建原子。形状包含在dtype“afieldtype”中(例如dtype([('col1', '<f8', (10,))])