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

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

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

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

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

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

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 番目の列では、最大値 8 4 は両方とも 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_arr out を設定する例をもう一度見てみましょう。

 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) は 要素が最初に出現するインデックスを返します。
  • 多次元配列を操作する場合、オプションの axis パラメーターを使用して、特定の軸に沿った最大要素のインデックスを取得できます。たとえば、2 次元配列の場合: axis = 0 axis = 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

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

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

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

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

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 番目の列では、最大値 8 4 は両方とも 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_arr out を設定する例をもう一度見てみましょう。

 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) は 要素が最初に出現するインデックスを返します。
  • 多次元配列を操作する場合、オプションの axis パラメーターを使用して、特定の軸に沿った最大要素のインデックスを取得できます。たとえば、2 次元配列の場合: axis = 0 axis = 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