labels = ['', 'blue', 'red', 'yellow', ...]
labels_to_idx = dict(zip(labels, range(len(labels))))
cond = " | ".join(["col{0} == '{1}'".format(i, labels_to_idx['blue'])
for i in range(10)])
rows = [[labels[x] for x in row[:]] for row in table.where(cond)]
你只有max
N=10
这个事实很好。这意味着进行这种比较是可能的。你应该做的是有10个字符串列,每列是一个标签。如果一行的标签少于10个,则用空白字符串填充。在这将允许您编写高效的查询表达式,可以在
Table.where()
和Table.read_where()
命令[1]中使用。假设列有愚蠢的名称“col0”、“col1”等。因为字符串比较在numexpr中是精确的,并且没有本机集类型,因此必须显式展开相等比较:幸运的是,编程构造
^{pr2}$cond
字符串很容易:然而,你还可以做更多的事情。字符串比较是庞大而缓慢的。这是因为所有的字符串都必须具有相同的大小,这意味着列大小由最长的标签决定。这会导致大量的空间浪费。相反,您应该有一个与标签整数的映射。然后你就可以存储这些整数,很快地对它们进行比较。例如,使用列表索引:
您甚至可以将标签列表存储在PyTables中作为一个array,这样您就可以确保始终获得相同的索引顺序,同时还可以扩展allow labels的列表。在
此外,由于标签将被重用,特别是空字符串标签,我强烈建议您启用压缩。在
不幸的是,由于列是索引的(不是表),所以不能为这些查询编制索引。在
通过压缩和映射到整数/从整数映射,这可能是最快和最小的。在
相关问题 更多 >
编程相关推荐