ホーム テクノロジー 開発 非公開: Python で NumPy argmax() 関数を使用する方法

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


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

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

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

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

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

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

 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 になります。最初の要素のインデックスは 0 です。 2 番目の要素はインデックス 1 にあり、以下同様です。

numpy-argmax
numpy-argmax

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

配列をタップして、最初のインデックスにある項目にアクセスする必要があります。最大値が発生する場所を見つけるには、 condition array_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 配列はゼロインデックスに従います。したがって、NumPy 配列array_2の行と列のインデックスは次のようになります。

numpy-argmax-2darray
numpy-argmax-2darray

ここで、2 次元配列array_2に対してargmax()関数を呼び出してみましょう。

 print(np.argmax(array_2))

# Output
4

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

なぜこのようなことが起こるのでしょうか? 🤔

これは、axis パラメータに値を指定していないためです。この軸パラメータが設定されていない場合、デフォルトでは、 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
numpy-argmax-axis0

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

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

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

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

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

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

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

出力を解析できますか?

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

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

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

numpy-argmax-axis1
numpy-argmax-axis1

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

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

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

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

NumPy argmax() 関数のオプションのout the パラメーターを使用して、出力を 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]

ここで、 axisoutパラメータの両方を指定して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) は要素が最初に出現するインデックスを返します。
  • 多次元配列を操作する場合、オプションのaxisパラメーターを使用して、特定の軸に沿った最大要素のインデックスを取得できます。たとえば、2 次元配列の場合: axis = 0axis = 1を設定すると、それぞれ行と列に沿った最大要素のインデックスを取得できます。
  • 戻り値を別の配列に保存したい場合は、オプションのoutパラメーターを出力配列に設定できます。ただし、出力配列の形状とデータ型は互換性がある必要があります。

次に、Python セットに関する詳細ガイドを確認してください。また、Python Sleep 関数を使用してコードに遅延を追加する方法も学習します。

「 Python で NumPy argmax() 関数を使用する方法」についてわかりやすく解説!絶対に観るべきベスト2動画

【毎日Python】Pythonで配列やリストを比較して最大値を取得する方法|numpy.maximum/fmax
argmin, argmax, min and max in NumPy Python | Module NumPy Tutorial – Part 16