大量の数値を含むテーブルがあります。列を抽出して max() を実行できることはわかっていますが、おそらくカーネル内メソッドを使用してこれを行う方法があります。しかし、それを見つけることができないようです。
3 に答える
私が行ったテストでは、 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 関数を使用する場所で見つけた最良の結果 (上記参照)。
また、より効率的な方法を教えていただければ幸いです。
これを行うために私が見つけた最速の方法は、興味のある列でテーブルをインデックス化することです。
table.cols.timestamp.createCSIndex()
インデックスが作成されると、最大値を取得するのはほぼ瞬時です。
max_timestamp = table.cols.timestamp[table.colindexes['timestamp'][-1]]
これは、最初にテーブルの Index オブジェクトからタイムスタンプ列 ( table.colindexes['timestamp'][-1]
) の最後の (最大のタイムスタンプに対応する) 行インデックスを取得し、次に、対応する列参照 ( ) にインデックス付けすることによって、それが指す行をフェッチしますtable.cols.timestamp
。
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))