2017-02-06 7 views
0
import numpy as np 
from scipy import linalg as linalg 
M = np.array([[1,2],[2,1],[3,4],[4,3]]) 
Evals, Evecs = linalg.eigh(M.T.dot(M)) 
EvecShape = Evecs.shape 
print Evals 
print Evecs 
ncols = EvecShape[1] 
for i in range(ncols/2): 
    Evals[i], Evals[ncols-1-i] = Evals[ncols-1-i], Evals[i] 
    Evecs[:,i], Evecs[:,ncols-1-i] = Evecs[:,ncols-1-i], Evecs[:,i] 
print Evals 
print Evecs 

MT * Mの固有値と固有ベクトルを計算し、対応する列をスワップすることで固有値を降順で並べ替える必要があります。np.arrayの2つの列を交換するとき、ここで何が起こっていますか?

[ 2. 58.] 
[[-0.70710678 0.70710678] 
[ 0.70710678 0.70710678]] 
[ 58. 2.] 
[[ 0.70710678 0.70710678] 
[ 0.70710678 0.70710678]] 

私はEvalsの要素を入れ替えたようです。しかし、Evecsにとって、何かが間違っていることは明らかです。誰が私にここで何が起こっているか教えてもらえますか?

答えて

1

コードの問題は、最初に読み出す前に列を入れ替えようとすると、もう一方の列を上書きするということです。これは、可能であれば配列スライスはデータをコピーせず、スライスされた配列のバッファを参照するためです。あなたを軽減するために

はどちらか

  • はそう

よう.copy()を使用してコピーを強制することができます。

Evecs[:,i], Evecs[:,ncols-1-i] = Evecs[:,ncols-1-i], Evecs[:,i].copy() 

または

  • は、ループを避け、ちょうど

を行います。

Evecs = Evecs[:, ::-1] 
1

2次元配列のように固有ベクトルをソートしようとしています。良くない。特定の方法を使用してください。この下で;

import numpy as np 
from scipy import linalg as linalg 
M = np.array([[1,2],[2,1],[3,4],[4,3]]) 
Evals, Evecs = linalg.eigh(M.T.dot(M)) 
print Evals 
print Evecs 

index = Evals.argsort()[::-1] 

Evals= Evals[index] 
Evecs = Evecs [:,index] 

print Evals 
print Evecs 
関連する問題