Numpyで検索
Oct 01 2020
以下のコードでabs(arr)を実行すると、昇順の数値を並べ替えました。符号が負から正に変更されたインデックスを検索しようとしています。これを以下のコードで記述しましたが、いくつかの理由で、改善または最適化できると思います。ヒントやコツはありますか?
import numpy as np
arr = np.array([-1,-2,-3, 4, 5, 6])
_cut_index_1 = np.where(arr > 0)[0][0]
_cut_index_2 = np.where(arr < 0)[0][-1]
arr[_cut_index_1] # output: 4
arr[_cut_index_2] # output: -3
回答
4 Juho Oct 03 2020 at 00:45
現在のソリューションは、入力配列を2回通過します(の2回の呼び出しnp.where)。これは、前述のように無駄に思えます。この問題を解決する簡単な方法の1つnp.argmaxは、線形時間を要するを使用することです。
import numpy as np
arr = np.array([-1, -2, -3, 4, 5, 6])
np.argmax(arr > 0) # Return (index) 3
この時点で、(あなたが示唆しているように)関心のある単一の位置があると仮定できる場合(および/または最初の位置のみを気にし、左から右に読んでいる場合)、完了です:から1つをデクリメントするだけです答えとあなたは他のカットオフポイントを持っています(しかし、無効なインデックスを返さないように、私たちがコーナーケースにいるかどうかを確認してください)。
しかし実際には、入力がソートされていると安全に想定できる場合は、線形スキャンを実行せずに、入力全体を読み取ることさえできません。このために、searchsortedを介してバイナリ検索を実行できます。理論的には、これは高速です(つまり、最悪の場合は対数対線形)が、実際には、これは配列のサイズに依存します。つまり、アレイが十分に小さい場合、キャッシュの局所性により線形スキャンが高速になります(または、少なくとも、ハードウェアの詳細を法として行う必要があります)。