在pytables中组合read_sorted和Expr的最有效内存方法是什么?

时间:2014-02-13 09:53:42

标签: python pytables numexpr

我正在寻找以排序顺序组合读取Pytables表(列:x,y,z)的最有效内存的方法(z列有CSI)并评估像

这样的表达式
x+a*y+b*z

其中a和b是常数。到目前为止,我唯一的解决方案是使用“sortyby = z”标志复制整个表格,然后在表格上逐个评估表达式。

注意:我想将结果x + a * y + b * z保留在内存中,对它进行一些减少操作,这些操作在Pytables中不能直接使用,然后将其保存到新的Pytables表中。

1 个答案:

答案 0 :(得分:2)

有两个基本选项,具体取决于您是否需要以排序方式进行迭代。

如果需要在排序表中迭代表,那么读入将比计算表达式要昂贵得多。因此,您应该使用Table.read_sorted()有效地读入并在列表推导或类似的计算中计算此表达式:

a = [row['x']+a*row['y']+b*row['z'] for row in 
     tab.read_sorted('z', checkCSI=True)]

如果您不需要以排序的方式进行迭代(它看起来不像您那样),您应该使用Expr classread in the CSI from the column来设置和评估表达式,将此应用于表达式结果。这看起来像是:

x = tab.cols.x
y = tab.cols.y
z = tab.cols.z
expr = tb.Expr('x+a*y+b*z')
unsorted_res = expr.eval()
idx = z.read_indices()
sorted_res = unsored_res[idx]