2

大量の数値を含むテーブルがあります。列を抽出して max() を実行できることはわかっていますが、おそらくカーネル内メソッドを使用してこれを行う方法があります。しかし、それを見つけることができないようです。

4

3 に答える 3

6

私が行ったテストでは、 where の代わりに iterrows メソッドを使用して、2 倍以上の高速な結果を得ることができます。

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 は、その列 (Float64) の 1000000 エントリであることに注意してください。

質問では比較チェックが求められないため、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 に答える