
このチュートリアルでは、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 段階のアプローチを取ることができます。
array_1 では、最大値 10 はインデックス 4 で発生し、インデックス 0 に続きます。 最初の要素のインデックスは 0 です。 2 番目の要素はインデックス 1 にあり、以下同様です。
最大値が発生するインデックスを見つけるには、NumPy の where() 関数を使用できます。 np.where(condition) は、条件が True であるすべてのインデックスの配列を返します。
配列をタップして、最初のインデックスでアイテムにアクセスする必要があります。 最大値が発生する場所を見つけるために、条件を array_1==10 に設定します。 10 が array_1 の最大値であることを思い出してください。
print(int(np.where(array_1==10)[0])) # Output 4
条件のみで np.where() を使用しましたが、これはこの関数を使用するための推奨される方法ではありません。
📑 注: NumPy where() 関数:
np.where(条件、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() 関数呼び出しで軸パラメーターを指定すると、配列はその軸に沿って縮小されます。 ただし、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 の行と列のインデックスは次のようになります。
次に、2 次元配列 array_2 で argmax() 関数を呼び出しましょう。
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])
この出力を理解するのは少し難しいかもしれませんが、それがどのように機能するかは理解できます。
行に沿って最大要素のインデックスを見つけたいので、軸パラメーターをゼロ (軸 = 0) に設定しました。 したがって、argmax() 関数は、3 つの列のそれぞれについて、最大要素が発生する行番号を返します。
理解を深めるために、これを視覚化してみましょう。
上の図と argmax() の出力から、次のことがわかります。
- インデックス 0 の最初の列の場合、最大値 10 はインデックス = 1 の 2 行目に発生します。
- インデックス 1 の 2 列目では、インデックス = 1 の 2 行目に最大値 9 が発生します。
- インデックス 2 と 3 の 3 列目と 4 列目では、インデックス = 1 の 2 行目に最大値 8 と 4 が発生します。
これがまさに、出力配列([1, 1, 1, 1]) 行に沿った最大要素が 2 行目に発生するため (すべての列)。
列に沿った最大要素のインデックス (軸 = 1)
次に、argmax() 関数を使用して、列に沿った最大要素のインデックスを見つけます。
次のコード スニペットを実行し、出力を確認します。
np.argmax(array_2,axis=1)
array([2, 0])
出力を解析できますか?
列に沿った最大要素のインデックスを計算するために、軸 = 1 を設定しました。
argmax() 関数は、行ごとに、最大値が発生する列番号を返します。
視覚的な説明は次のとおりです。
上の図と argmax() の出力から、次のことがわかります。
- インデックス 0 の最初の行では、最大値 7 はインデックス = 2 の 3 列目に発生します。
- インデックス 1 の 2 行目では、インデックス = 0 の最初の列で最大値 10 が発生します。
出力、配列([2, 0]) 意味。
NumPy argmax() でオプションの out パラメータを使用する
オプションの out the パラメータを NumPy argmax() 関数で使用して、出力を NumPy 配列に格納できます。
前の argmax() 関数呼び出しの出力を格納するためにゼロの配列を初期化しましょう – 列 (軸 = 1) に沿った最大値のインデックスを見つけます。
out_arr = np.zeros((2,)) print(out_arr) [0. 0.]
ここで、列 (軸 = 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) は要素の最初の出現のインデックスを返します。
- 多次元配列を操作する場合、オプションの軸パラメーターを使用して、特定の軸に沿った最大要素のインデックスを取得できます。 たとえば、2 次元配列では、軸 = 0 と軸 = 1 を設定すると、それぞれ行と列に沿った最大要素のインデックスを取得できます。
- 戻り値を別の配列に格納したい場合は、オプションの out パラメータを出力配列に設定できます。 ただし、出力配列は互換性のある形状とデータ型である必要があります。
次に、Python セットの詳細なガイドを確認してください。