我有一个具有大量退化特征值的实对称矩阵,我想找到这个矩阵的实值特征向量。我正在努力找到一个numpy或scipy方法为我做这个,我尝试过的方法给出复杂的有价值的特征向量。有谁知道这样的功能是否存在?
答案 0 :(得分:2)
使用numpy.linalg.eigh
或scipy.linalg.eigh
。这些函数是为对称(或Hermitian)矩阵设计的,并且对于实对称矩阵,它们应该总是返回实特征值和特征向量。
例如,
In [62]: from numpy.linalg import eigh
In [63]: a
Out[63]:
array([[ 2., 1., 0., 0.],
[ 1., 2., 0., 0.],
[ 0., 0., 2., 1.],
[ 0., 0., 1., 2.]])
In [64]: vals, vecs = eigh(a)
特征值在vals
中,相应的特征向量在vecs
列中:
In [65]: vals
Out[65]: array([ 1., 1., 3., 3.])
In [66]: vecs
Out[66]:
array([[-0.70710678, 0. , 0. , 0.70710678],
[ 0.70710678, 0. , 0. , 0.70710678],
[ 0. , -0.70710678, 0.70710678, 0. ],
[ 0. , 0.70710678, 0.70710678, 0. ]])
答案 1 :(得分:1)
易。
在the docs的帮助下:
import numpy as np
from numpy import linalg as LA
a = np.array([[1, 1j], [-1j, 1]])
w, v = LA.eig(a)
# w are the eigenvalues, v are the eigenvectors
# v.real gives the real-valued parts of the eigenvectors
# v == v.real gives a boolean mask for where the vector equals its own real part
real_eigenvectors = v[v.real == v]
答案 2 :(得分:0)
vals, vecs = eigh(a)
vals = vals.real
vecs = vecs.real
应该可以。