2016-05-19 18 views
1

numpy.argminとnumpy.aminの両方の結果をnumpyを一度に呼び出して取得できますか?ありがとう。効率的にnumpy.argminとnumpy.aminを同時に取得する

+0

別々の行で呼び出しても、コンマで区切っても問題ありませんか? – EdChum

+0

。私はargminとaminの両方を行うことができる配列の単一のチェックがあると思っていた。配列をargminのために1回チェックしてからもう一度aminをチェックすると時間が浪費されるようです。それとも、これは実際には遅いですか? – rxu

答えて

4

np.argminを使用すると、最小値に対応するインデックスを取得し、NumPy's advanced indexingのインデックスを使用して最小値を取得できます。

2Dアレイを使用して、使用方法を紹介しましょう。 A2D配列とし、axis=1に沿って最小のインデックスと値を探したいとします。

したがって、我々は行うことができます -

min_idx = np.argmin(A,axis=1) 
min_val = A[np.arange(A.shape[0]),min_idx] 

のは、サンプル実行のための実際の2D配列を取り、結果を検証してみましょう -

In [16]: A 
Out[16]: 
array([[79, 97, 12, 54, 59], 
     [44, 45, 42, 78, 32], 
     [32, 41, 67, 60, 4], 
     [24, 4, 85, 94, 65]]) 

In [17]: min_idx = np.argmin(A,axis=1) 

In [18]: A[np.arange(A.shape[0]),min_idx] # Using min_idx & indexing 
Out[18]: array([12, 32, 4, 4]) 

In [19]: np.amin(A,axis=1)    # Using np.amin to verify 
Out[19]: array([12, 32, 4, 4]) 

ランタイムテストを -

In [26]: def original_app(A): 
    ...:  min_idx = np.argmin(A,axis=1) 
    ...:  min_val = np.amin(A,axis=1) 
    ...:  return min_idx, min_val 
    ...: 
    ...: def proposed_app(A): 
    ...:  min_idx = np.argmin(A,axis=1) 
    ...:  min_val = A[np.arange(A.shape[0]),min_idx] 
    ...:  return min_idx, min_val 
    ...: 

In [27]: A = np.random.randint(0,99,(4000,5000)) 

In [28]: %timeit original_app(A) 
10 loops, best of 3: 70.9 ms per loop 

In [29]: %timeit proposed_app(A) 
10 loops, best of 3: 33.1 ms per loop 

タイミングもう少しCT -

In [31]: min_idx = np.argmin(A,axis=1) 

In [32]: %timeit np.argmin(A,axis=1)    # Used in both methods 
10 loops, best of 3: 34.5 ms per loop 

In [33]: %timeit np.amin(A,axis=1)    # Original approach 
10 loops, best of 3: 37.3 ms per loop 

In [34]: %timeit A[np.arange(A.shape[0]),min_idx] # Proposed approach 
10000 loops, best of 3: 56 µs per loop 

我々はそれに費やさ無視できるランタイムとの最後の段階で高度なインデックスを持つ大きなゲインを見ることができるように。これによりほぼ100%のランタイムシェービングが可能になりました!

+0

私もこのことについて考えていました。後でタイミングを取るかもしれない。 – rxu

+0

@rxu '(4000,5000)'の形をした '2D'ケースのタイミングを追加しました。 – Divakar

関連する問題