[解決済み] numpyによる効率的な配列の閾値フィルタリング
2023-07-20 02:41:41
質問
ある閾値より低い要素を取り除くために、配列をフィルタリングする必要があります。私の現在のコードは次のようなものです。
threshold = 5
a = numpy.array(range(10)) # testing data
b = numpy.array(filter(lambda x: x >= threshold, a))
問題は、これがラムダ関数によるフィルタを使って、一時的なリストを作成することです(遅い)。
これは非常に単純な操作なので、もしかしたら効率的にこれを行うnumpy関数があるかもしれませんが、私はそれを見つけられませんでした。
私はこれを達成する別の方法は、配列をソートし、閾値のインデックスを見つけ、そのインデックス以降のスライスを返すことができると考えましたが、これは小さな入力ではより速くなるとしても(そしてそれはとにかく顕著ではありません)、入力サイズが大きくなると漸近的に明らかに効率が悪くなってしまいます。
何かアイデアはありますか? ありがとうございます。
更新 : 入力が100.000.000エントリのとき、ソートとスライシングは純粋なPythonフィルタよりもまだ2倍速かったです。
In [321]: r = numpy.random.uniform(0, 1, 100000000)
In [322]: %timeit test1(r) # filter
1 loops, best of 3: 21.3 s per loop
In [323]: %timeit test2(r) # sort and slice
1 loops, best of 3: 11.1 s per loop
In [324]: %timeit test3(r) # boolean indexing
1 loops, best of 3: 1.26 s per loop
どのように解決するのですか?
b = a[a>threshold]
このようにします。
以下のようにテストしてみました。
import numpy as np, datetime
# array of zeros and ones interleaved
lrg = np.arange(2).reshape((2,-1)).repeat(1000000,-1).flatten()
t0 = datetime.datetime.now()
flt = lrg[lrg==0]
print datetime.datetime.now() - t0
t0 = datetime.datetime.now()
flt = np.array(filter(lambda x:x==0, lrg))
print datetime.datetime.now() - t0
私は
$ python test.py
0:00:00.028000
0:00:02.461000
http://docs.scipy.org/doc/numpy/user/basics.indexing.html#boolean-or-mask-index-arrays
関連
-
[解決済み] NumPyの配列を切り詰めずに、完全に表示するにはどうしたらよいですか?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] リスト内包とラムダ+フィルタの比較
-
[解決済み] NumPyでユークリッド距離はどのように計算できますか?
-
[解決済み] NumPy の配列を csv ファイルにダンプする
-
[解決済み】numpyの配列を逆引きする最も効率的な方法
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PILからopenCVフォーマットへの変換
-
[解決済み] Pythonの要素別タプル演算(sumなど
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] Python Empty Generator 関数
-
[解決済み] Python 言語を決定するには?
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複