2016-09-27 5 views
0

軸上にlennの間隔があるとします。それぞれにndarrayの値が割り当てられます。今度は浮動小数点数として与えられた位置query_posでいくつかの値を検索したいと思います。現在、私はそれを次の方法を行うことを計画します。浮動小数点インデックスから配列への高速検索

n = 100 
len = 0.39483 
data = ... # creates ndarray with data of length n = 100 
query_pos = ... # creates an ndarray with positions to query 
values_at_query_pos = data[(query_pos/len).astype(int)] # questionable line 

良い方法はそれを行うか、整数インデックスに浮動小数点クエリ位置を変換するために、より効率的な方法があり、その後、アレイから読み取ることです?私は特に、astype(int)が安価であるか高価な操作であるかどうか疑問に思っています。

いくつかのより多くの発言:

  • 最後に、それは2および3次元で使用されます。現在、私は に、の前にの不正なインデックスにつながる位置をキャッチし、検索の段階に とする予定です。

  • dataアレイの解像度は十分高く、 にはフィルタリングや補間が必要ありません。これは以前の ステージで行われます。その代わりに、スカラーでquery_posの各要素を分割する

答えて

4

、我々はスカラーの逆数を事前に計算し、そこにいくつかの高速化のための代わりに乗算を使用することができます。直感は、除算は乗算よりもコストが高いことである。ここで

はそれに迅速な実行時のテストだ -

In [177]: # Setup inputs 
    ...: n = 100 
    ...: len1 = 0.39483 
    ...: data = np.random.rand(100) 
    ...: query_pos = np.random.randint(0,25,(100000)) 
    ...: 

In [178]: %timeit query_pos/len1 
1000 loops, best of 3: 612 µs per loop 

In [179]: %timeit query_pos * (1/len1) 
10000 loops, best of 3: 173 µs per loop 

第二に、ちょうど前に示した実行時のテストのために使用されたセットアップのように、多くの繰り返しのインデックスがある場合、我々はさらにいくつかのわずかな改善のためのnp.takeを使用することができます、以下のように - あなたは、一般的なndarrays上でそれを使用することを計画している場合

In [196]: %timeit data[(query_pos *(1/len1)).astype(int)] 
1000 loops, best of 3: 538 µs per loop 

In [197]: %timeit np.take(data,(query_pos * (1/len1)).astype(int)) 
1000 loops, best of 3: 526 µs per loop 

、我々はnp.takeaxisのparamを使用する必要があります。独創的なアプローチと比較

-

In [202]: %timeit data[(query_pos/len1).astype(int)] 
1000 loops, best of 3: 967 µs per loop 

最後に、除算演算がintへの変換に対して、最大スタックかの質問に、彼らは大きなデータセットに匹敵するようです。しかし、インデックス作成に必要な変換を避けることはできないようです。ここでのタイミング試験です -

In [210]: idx = query_pos * (1/len1) 

In [211]: %timeit query_pos * (1/len1) 
10000 loops, best of 3: 165 µs per loop 

In [212]: %timeit idx.astype(int) 
10000 loops, best of 3: 110 µs per loop 
1

あなたが出力除算の結果をストレートint配列にすることができます

idx = np.empty_like(query_pos, int) 
np.divide(query_pos, len, out=idx, casting='unsafe') 

これだけ大規模な配列のために著しく速くなります。しかし、このコードは読みにくいので、ボトルネックであれば最適化するだけです!

関連する問題