#はじめに
正方行列の要素の最大値となるインデックスの行番号・列番号を求めます。
科学・技術計算ではよく行う作業です。numpy.argmaxメソッドを使います。
テストで用いる行列Cを構築します。
C=np.array( [[1,2,3,-4],[2,5,4,0],[3,4,1,1],[-4,0,10,2]])
Cの最大値はインデックス[3,2]にありますね。
そして,これを求めるために
np.argmax(C)
としても残念ながらインデックスを0からの通し番号である"14"が返されるだけで,望んでいた行・列の要素番号である[3,2]が得られません。
本稿では, 上の[3,2]を取得するコードを作ります。
#もっとカンタンにできる方法があれば教えていただければ幸いです。。
###追記 2017年10月5日
SatoshiTerasaki さまより,最も簡単な方法を教えてもらいました。SatoshiTerasakiさま,ありがとうございました!
C=np.array( [[1,2,3,-4],[2,5,4,0],[3,4,1,1],[-4,0,10,2]])
np.argwhere(C == C.max())
だけでokです。
非対角要素の最大値なども探したら簡単な方法があるかもしれません。
分かったら更新いたします。
#コード
とてもシンプルです。
要するに行数の番号を計算するために,行列のサイズ(今の場合は4)で割り切れる最大の整数値が列のインデックス番号,そしてそれの余りが行のインデックス番号に対応するので,pythonの組み込み関数である "//"と"%"を用いればokです。
#行列Cの定義
C=np.array( [[1,2,3,-4],[2,5,4,0],[3,4,1,1],[-4,0,10,2]])
index=np.argmax(C)
# メイン
index_list=[]
i = index // len(C) # 行のインデックス番号の取得
j = index % len(C) # 列のインデックス番号
index_list.append(i)
index_list.append(j)
print(index_list)
#結果
[3, 2]
望みの結果が得られました。
#発展
以下,様々な利用シーンを考えます。
非対角要素の最大値
非対角要素の最大値を求める場合は,
まず対角要素をゼロにしてから上のコードを実行します。
C=np.array( [[21,2,3,-4],[2,5,4,0],[3,4,1,1],[-4,0,10,2]])
for i in range(len(C)) :
C[i,i] = 0
#
index_list=[]
index=np.argmax(C)
i = index // len(C)
j = index % len(C)
index_list.append(i)
index_list.append(j)
print(index_list)
###結果:
数値が21の[0,0]ではなく,きちんと[3, 2]を返します。
##非対角要素の絶対値の最大値
行列が以下のように負の大きな数を含む場合です。
絶対値が100となるインデックス[1,2]を取得します。
そのためには,要素の絶対値をとったものをさきに作ってから上の方法を適用します。
#行列Cの定義
C=np.array( [[1,2,3,-4],[2,5,-100,0],[3,4,1,1],[-4,0,10,2]])
D= np.abs(C) # 絶対値をとったものに変換しそれをDとする
index=np.argmax(D)
# メイン
index_list=[]
i = index // len(C) # 行のインデックス番号¥の取得
j = index % len(C) # 列のインデックス番号
index_list.append(i)
index_list.append(j)
print(index_list)
###結果
[1, 2]
okです。
##最小値の場合
例として以下の行列を考えます。
負の最大値-10のインデックスは[3,1]です。これを取得します。
それには要素の最小値のインデックスを返すnp.argminメソッドを使います。
C=np.array( [[21,2,3,-9],[2,5,4,0],[3,4,1,1],[-4,-10,10,2]])
index=np.argmin(C)
for i in range(len(C)) :
C[i,i] = 0
#
index_list=[]
i = index // len(C)
j = index % len(C)
index_list.append(i)
index_list.append(j)
print(index_list)
###結果
[3, 1]
okです。