2

我有一个包含大量数值的表,我知道我可以提取列并对其执行 max(),但可能有一种方法可以使用内核方法来执行此操作。只是似乎无法找到它。

4

3 回答 3

6

在我所做的测试中,您可以使用 iterrows 方法而不是 where:

In [117]: timeit max(row['timestamp'] for row in table.iterrows(stop=1000000))
1 loops, best of 3: 1 s per loop

In [118]: timeit max(row['timestamp'] for row in table.where('(timestamp<=Tf)'))
1 loops, best of 3: 2.21 s per loop

In [120]: timeit max(frames.cols.timestamp[:1000000])
1 loops, best of 3: 974 ms per loop

In [121]: timeit np.max(frames.cols.timestamp[:1000000])
1 loops, best of 3: 876 ms per loop

请注意,上面的 Tf 是该列的 1000000 条目(这是一个 Float64)。

由于该问题不要求进行比较检查,因此可以省去 where 测试...请注意,问题中提出的方法(将数据加载为 numpy 数组)仍然更快(尽管差异小于 3% 和对于更大的数据集变得更小,我没有测试超过 10^7 行)。我发现使用 max numpy 函数的最佳结果(见上文)。

我也很乐意学习更有效的方法!

于 2012-04-03T13:54:21.797 回答
3

我发现最快的方法是在你感兴趣的列上索引你的表:

table.cols.timestamp.createCSIndex()

一旦被索引,获得最大值几乎是即时的:

max_timestamp = table.cols.timestamp[table.colindexes['timestamp'][-1]]

这将首先从表的 Index 对象中获取时间戳列 ( table.colindexes['timestamp'][-1]) 的最后一个(对应于最大时间戳)行索引,然后它会通过索引到相应的列引用 ( table.cols.timestamp) 来获取它指向的行。

于 2013-01-15T19:39:53.547 回答
2

来自PyTables & Family 的高性能数据管理(pdf):

e = sum(row['col1'] for row in table.where(3<table.cols.col2<=20))

修改它以使用max()

e = max(row['col1'] for row in table.where(3<table.cols.col2<=20))
于 2012-03-31T09:22:04.000 回答