Python で NumPy argmax() 関数を使用する方法

公開: 2022-09-14

このチュートリアルでは、 NumPy argmax() 関数を使用して、配列内の最大要素のインデックスを見つける方法を学習します。

NumPy は、Python で科学計算を行うための強力なライブラリです。 Python リストよりもパフォーマンスの高い N 次元配列を提供します。 NumPy 配列を操作するときに実行する一般的な操作の 1 つは、配列内の最大値を見つけることです。 ただし、最大値が発生するインデックスを見つけたい場合があります。

argmax()関数は、1 次元配列と多次元配列の両方で最大値のインデックスを見つけるのに役立ちます。 それがどのように機能するかを学びましょう。

NumPy 配列の最大要素のインデックスを見つける方法

このチュートリアルを進めるには、Python と NumPy がインストールされている必要があります。 Python REPL を開始するか、Jupyter ノートブックを起動することで、コーディングできます。

まず、NumPy を通常のエイリアスnpでインポートしましょう。

 import numpy as np

NumPy max()関数を使用して、配列内の最大値を取得できます (オプションで特定の軸に沿って)。

 array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.max(array_1)) # Output 10

この場合、 np.max(array_1)は正しい 10 を返します。

配列内で最大値が発生するインデックスを見つけたいとします。 次の 2 段階のアプローチを取ることができます。

  1. 最大要素を見つけます。
  2. 最大要素のインデックスを見つけます。

array_1では、最大値 10 はインデックス 4 で発生し、ゼロのインデックス付けに続きます。 最初の要素のインデックスは 0 です。 2 番目の要素はインデックス 1 にあり、以下同様です。

numpy-argmax

最大値が発生するインデックスを見つけるには、NumPy の where() 関数を使用できます。 np.where(condition)は、 conditionTrueであるすべてのインデックスの配列を返します。

配列をタップして、最初のインデックスでアイテムにアクセスする必要があります。 最大値が発生する場所を見つけるために、 conditionarray_1==10に設定します。 10 がarray_1の最大値であることを思い出してください。

 print(int(np.where(array_1==10)[0])) # Output 4

条件のみnp.where()を使用しましたが、これはこの関数を使用するための推奨される方法ではありません

注: NumPy where() 関数:
np.where(condition,x,y)戻り値:

– 条件がTrueの場合のxの要素、および
– 条件がFalseの場合のyの要素。

したがって、 np.max() () 関数とnp.where()関数を連鎖させると、最大の要素と、それが発生するインデックスが続きます。

上記の 2 段階のプロセスの代わりに、NumPy argmax() 関数を使用して、配列内の最大要素のインデックスを取得できます。

NumPy argmax() 関数の構文

NumPy argmax() 関数を使用する一般的な構文は次のとおりです。

 np.argmax(array,axis,out) # we've imported numpy under the alias np

上記の構文では:

  • arrayは任意の有効な NumPy 配列です。
  • axisはオプションのパラメーターです。 多次元配列を操作する場合、axis パラメーターを使用して、特定の軸に沿った最大値のインデックスを見つけることができます。
  • outは別のオプション パラメータです。 outパラメータを NumPy 配列に設定して、 argmax()関数の出力を格納できます。

: NumPy バージョン 1.22.0 から、追加のkeepdimsパラメーターがあります。 argmax()関数呼び出しでaxisパラメーターを指定すると、配列はその軸に沿って縮小されます。 ただし、 keepdimsパラメーターをTrueに設定すると、返される出力が入力配列と同じ形状になることが保証されます。

NumPy argmax() を使用して最大要素のインデックスを見つける

#1 。 NumPy argmax() 関数を使用して、 array_1の最大要素のインデックスを見つけてみましょう。

 array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.argmax(array_1)) # Output 4

argmax()関数は 4 を返します。これは正しいです!

#2 。 10 が 2 回発生するようにarray_1を再定義すると、 argmax()関数は最初に発生したインデックスのみを返します。

 array_1 = np.array([1,5,7,2,10,10,8,4]) print(np.argmax(array_1)) # Output 4

残りの例では、例 1 で定義したarray_1の要素を使用します。

NumPy argmax() を使用して 2D 配列の最大要素のインデックスを見つける

NumPy 配列array_1を 2 行 4 列の 2 次元配列に変形してみましょう。

 array_2 = array_1.reshape(2,4) print(array_2) # Output [[ 1 5 7 2] [10 9 8 4]]

2 次元配列の場合、軸 0 は行を表し、軸 1 は列を表します。 NumPy 配列はzero-indexingに従います。 したがって、NumPy 配列array_2の行と列のインデックスは次のようになります。

numpy-argmax-2darray

次に、2 次元配列array_2argmax()関数を呼び出しましょう。

 print(np.argmax(array_2)) # Output 4

2 次元配列でargmax()を呼び出しても、4 が返されます。これは、前のセクションの 1 次元配列array_1の出力と同じです。

なぜこれが起こるのですか?

これは、軸パラメーターに値を指定していないためです。 この軸パラメーターが設定されていない場合、デフォルトでは、 argmax()関数は平坦化された配列に沿った最大要素のインデックスを返します。

フラット化された配列とは何ですか? 形状がd1 x d2 x … x dNの N 次元配列がある場合 (d1、d2、最大 dN は N 次元に沿った配列のサイズ)、平坦化された配列はサイズの長い 1 次元配列です。 d1 * d2 * … * dN.

フラット化された配列がarray_2でどのように見えるかを確認するには、以下に示すようにflatten()メソッドを呼び出します。

 array_2.flatten() # Output array([ 1, 5, 7, 2, 10, 9, 8, 4])

行に沿った最大要素のインデックス (軸 = 0)

行に沿って最大要素のインデックスを見つけてみましょう (軸 = 0)。

 np.argmax(array_2,axis=0) # Output array([1, 1, 1, 1])

この出力を理解するのは少し難しいかもしれませんが、それがどのように機能するかは理解できます。

行に沿って最大要素のインデックスを見つけたいので、 axisパラメーターをゼロ ( axis = 0 ) に設定しました。 したがって、 argmax()関数は、3 つの列のそれぞれについて、最大要素が発生する行番号を返します。

理解を深めるために、これを視覚化してみましょう。

numpy-argmax-axis0

上の図とargmax()の出力から、次のことがわかります。

  • インデックス 0 の最初の列の場合、最大値10はインデックス = 1 の 2 行目に発生します。
  • インデックス 1 の 2 列目では、インデックス = 1 の 2 行目に最大値9が発生します。
  • インデックス 2 と 3 の 3 列目と 4 列目では、インデックス = 1 の 2 行目に最大値84が発生します。

行に沿った最大要素が 2 行目 (すべての列) で発生するため、出力array([1, 1, 1, 1])が得られるのはまさにこのためです。

列に沿った最大要素のインデックス (軸 = 1)

次に、 argmax()関数を使用して、列に沿った最大要素のインデックスを見つけます。

次のコード スニペットを実行し、出力を確認します。

 np.argmax(array_2,axis=1)
 array([2, 0])

出力を解析できますか?

列に沿った最大要素のインデックスを計算するために、 axis = 1を設定しました。

argmax()関数は、行ごとに、最大値が発生する列番号を返します。

視覚的な説明は次のとおりです。

numpy-argmax-axis1

上の図とargmax()の出力から、次のことがわかります。

  • インデックス 0 の最初の行では、最大値7はインデックス = 2 の 3 列目に発生します。
  • インデックス 1 の 2 行目では、インデックス = 0 の最初の列で最大値10が発生します。

出力array([2, 0])が何を意味するか理解できたと思います。

NumPy argmax() でオプションの out パラメータを使用する

オプションのout the パラメータを NumPy argmax() 関数で使用して、出力を NumPy 配列に格納できます。

前のargmax()関数呼び出しの出力を格納するためにゼロの配列を初期化しましょう – 列に沿って最大のインデックスを見つけます ( axis= 1 )。

 out_arr = np.zeros((2,)) print(out_arr) [0. 0.]

ここで、列 ( axis = 1 ) に沿って最大要素のインデックスを見つける例に戻り、上記で定義したout_arroutを設定しましょう。

 np.argmax(array_2,axis=1,out=out_arr)

out_arrはデフォルトで float の配列に初期化されているため、Python インタープリターがTypeErrorをスローすることがわかります。

 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) /usr/local/lib/python3.7/dist-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds) 56 try: ---> 57 return bound(*args, **kwds) 58 except TypeError: TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe'

したがって、 outパラメーターを出力配列に設定するときは、出力配列が正しい形状とデータ型であることを確認することが重要です。 配列インデックスは常に整数であるため、出力配列を定義するときにdtypeパラメータをintに設定する必要があります。

 out_arr = np.zeros((2,),dtype=int) print(out_arr) # Output [0 0]

これで、 axisパラメーターとoutパラメーターの両方を指定してargmax()関数を呼び出すことができます。今回は、エラーなしで実行されます。

 np.argmax(array_2,axis=1,out=out_arr)

argmax()関数の出力は、配列out_arrでアクセスできるようになりました。

 print(out_arr) # Output [2 0]

結論

このチュートリアルが、NumPy argmax() 関数の使用方法を理解するのに役立つことを願っています。 コード例は Jupyter ノートブックで実行できます。

学んだことを復習しましょう。

  • NumPy argmax() 関数は、配列内の最大要素のインデックスを返します。 最大要素が配列aに複数回出現する場合、 np.argmax(a)は要素の最初の出現のインデックスを返します。
  • 多次元配列を操作する場合、オプションのパラメーターを使用して、特定の軸に沿った最大要素のインデックスを取得できます。 たとえば、2 次元配列の場合: axis = 0axis = 1を設定すると、それぞれ行と列に沿った最大要素のインデックスを取得できます。
  • 戻り値を別の配列に格納したい場合は、オプションのoutパラメータを出力配列に設定できます。 ただし、出力配列は互換性のある形状とデータ型である必要があります。

次に、Python セットの詳細なガイドを確認してください。