対角化できなかったとき
対角化しようとしたらうまく行かなかった時の話
やりたいこと
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.]]