2016-06-22 6 views
1

ある条件(私の場合は中程度の閾値)を満たす1次元NumPy配列の最小値の位置を取得することに興味があります。例えば:私は効果的にnp.argminの結果は6になるような制限下にあるa内のすべての数値を、マスクしたいnumpy.argminが閾値より大きい場合

import numpy as np 

limit = 3 
a = np.array([1, 2, 4, 5, 2, 5, 3, 6, 7, 9, 10]) 

はない値をマスクする計算上安価な方法はあります条件を満たしてからnp.argminを適用しますか?

+0

なぜあなたの質問にnp.argminが6であると説明できますか?この場合は0になります。3未満のすべての数値をマスクした場合、[4,5,5,3,6,7,9,10]となります。このnp.argminはまだ6ではありません。 – OneRaynyDay

答えて

1

を用いて達成することができます最終的な索引出力。このセクションでは、私は定期的にに対してother solution based on masked arrayを比較しています、パフォーマンスベンチマークのための

-

valid_idx = np.where(a >= limit)[0] 
out = valid_idx[a[valid_idx].argmin()] 

サンプル実行 - -

In [32]: limit = 3 
    ...: a = np.array([1, 2, 4, 5, 2, 5, 3, 6, 7, 9, 10]) 
    ...: 

In [33]: valid_idx = np.where(a >= limit)[0] 

In [34]: valid_idx[a[valid_idx].argmin()] 
Out[34]: 6 

ランタイムテストしたがって、実装は次のようになりますアレイベースのソリューションです。

def masked_argmin(a,limit): # Defining func for regular array based soln 
    valid_idx = np.where(a >= limit)[0] 
    return valid_idx[a[valid_idx].argmin()] 

In [52]: # Inputs 
    ...: a = np.random.randint(0,1000,(10000)) 
    ...: limit = 500 
    ...: 

In [53]: %timeit np.argmin(np.ma.MaskedArray(a, a<limit)) 
1000 loops, best of 3: 233 µs per loop 

In [54]: %timeit masked_argmin(a,limit) 
10000 loops, best of 3: 101 µs per loop 

In [55]: # Inputs 
    ...: a = np.random.randint(0,1000,(100000)) 
    ...: limit = 500 
    ...: 

In [56]: %timeit np.argmin(np.ma.MaskedArray(a, a<limit)) 
1000 loops, best of 3: 1.73 ms per loop 

In [57]: %timeit masked_argmin(a,limit) 
1000 loops, best of 3: 1.03 ms per loop 
2

これは単にあなたが有効なインデックスを保存し、両方のaから有効な要素を選択しても取得するために選択された要素の中argmin()とにインデックスを付けるために、それらを使用することができますnumpyののMaskedArray

import numpy as np 

limit = 3 
a = np.array([1, 2, 4, 5, 2, 5, 3, 6, 7, 9, 10]) 
b = np.ma.MaskedArray(a, a<3) 
np.ma.argmin(b) # == 6 
+1

マスクされた配列には、 'np.argmin'ではなく' np.ma.argmin'を使用してください。マスクされた配列で非 ''関数 ''を使うと、それらの関数のいくつかに対して実際にマスクされた配列のサポートがないことが判明したときに、驚くような驚きを引き起こす可能性があります。 – user2357112

関連する問題