対角化できなかったとき

対角化しようとしたらうまく行かなかった時の話

やりたいこと

1次元numpy配列の対角化

使用データ

np_re=np.zeros((1,4))
print (np_re)
np_re[0:,]=[[1,2,3,4]]
print (np_re)
[[0. 0. 0. 0.]]
[[1. 2. 3. 4.]]

問題

実際のコードがこれ

    row_cnt=np_re.shape[0]#行の要素数確認
    pre_npre=np_re[row_cnt-1:]#行の最終行を抽出
    print(pre_npre)
    
    diag0=np.diag(pre_npre)
    print(np.diag(pre_npre))

結果

[[1. 2. 3. 4.]]
[1.]

なぜだ

原因

原因は対角化の引数に入れたpre_npreの次元が1のつもりが2だった

row_cnt=np_re.shape[0]#行の要素数確認
    #print (row_cnt)
    pre_npre=np_re[row_cnt-1:]#行の最終行を抽出
    print(pre_npre)
    print (pre_npre.shape)
    print (pre_npre.ndim)

結果

[[1. 2. 3. 4.]]
(1, 4)
2

対策

pre_npreの次元を1にする

np.ravel

多次元numpy配列を1次元にする

    pre_npre=np_re[row_cnt-1:]#行の最終行を抽出
    print(pre_npre)
    print (pre_npre.ndim)

    pre_npre1d=np.ravel(pre_npre)
    print (pre_npre1d)
    print (pre_npre1d.ndim)

結果

[[1. 2. 3. 4.]]
2
[1. 2. 3. 4.]
1

完成

完成したコードがこれ

np_re=np.zeros((1,4))
np_re[0:,]=[[1,2,3,4]]

for idx, row in df.iterrows():
    row_cnt=np_re.shape[0]#行の要素数確認
    pre_npre=np_re[row_cnt-1:]#行の最終行を抽出

    pre_npre1d=np.ravel(pre_npre)
    diag0=np.diag(pre_npre1d)
    print (diag0)

結果

[[1. 0. 0. 0.]
 [0. 2. 0. 0.]
 [0. 0. 3. 0.]
 [0. 0. 0. 4.]]