numpy.linalg.eig#

linalg.eig(a)[source]#

计算方阵的特征值和右特征向量。

参数:
a(…, M, M) 数组

将计算其特征值和右特征向量的矩阵。

返回值:
一个具有以下属性的命名元组
eigenvalues(…, M) 数组

特征值,每个特征值根据其重数重复出现。特征值不一定是有序的。除非虚部为零,否则结果数组将为复数类型,在这种情况下,它将转换为实数类型。当 a 为实数时,所得特征值将为实数(虚部为 0)或成共轭对出现。

eigenvectors(…, M, M) 数组

归一化(单位“长度”)的特征向量,使得列 eigenvectors[:,i] 是对应于特征值 eigenvalues[i] 的特征向量。

引发:
LinAlgError

如果特征值计算不收敛。

另请参见

eigvals

非对称阵的特征值。

eigh

实对称阵或复厄米特(共轭对称)阵的特征值和特征向量。

eigvalsh

实对称阵或复厄米特(共轭对称)阵的特征值。

scipy.linalg.eig

SciPy 中的类似函数,也求解广义特征值问题。

scipy.linalg.schur

对于酉矩阵和其他非厄米特正规矩阵的最佳选择。

注释

广播规则适用,详情请参阅 numpy.linalg 文档。

这是使用 _geev LAPACK 例程实现的,该例程计算一般方阵的特征值和特征向量。

如果存在向量 v 使得 a @ v = w * v,则数字 wa 的特征值。因此,数组 aeigenvalueseigenvectors 满足方程 a @ eigenvectors[:,i] = eigenvalues[i] * eigenvectors[:,i],其中 \(i \in \{0,...,M-1\}\)

数组 eigenvectors 可能不是最大秩的,也就是说,一些列可能线性相关,尽管舍入误差可能会掩盖这一事实。如果所有特征值都不同,那么理论上特征向量是线性无关的,并且 a 可以通过使用 eigenvectors 进行相似变换对角化,即 inv(eigenvectors) @ a @ eigenvectors 是对角阵。

对于非厄米特正规矩阵,SciPy 函数 scipy.linalg.schur 更为可取,因为矩阵 eigenvectors 保证是酉矩阵,而使用 eig 时则并非如此。Schur 分解产生一个上三角矩阵而不是对角矩阵,但对于正规矩阵,只需要上三角矩阵的对角线,其余的是舍入误差。

最后,需要强调的是,eigenvectorsa(如右手边)特征向量组成。满足 y.T @ a = z * y.T(对于某个数字 z)的向量 y 称为 a特征向量,并且通常情况下,矩阵的左特征向量和右特征向量不一定是(可能共轭的)彼此的转置。

参考文献

G. Strang, Linear Algebra and Its Applications, 2nd Ed., Orlando, FL, Academic Press, Inc., 1980, Various pp.

示例

>>> import numpy as np
>>> from numpy import linalg as LA

具有实特征值和特征向量的(几乎)平凡示例。

>>> eigenvalues, eigenvectors = LA.eig(np.diag((1, 2, 3)))
>>> eigenvalues
array([1., 2., 3.])
>>> eigenvectors
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

具有复特征值和特征向量的实矩阵;请注意,特征值彼此共轭。

>>> eigenvalues, eigenvectors = LA.eig(np.array([[1, -1], [1, 1]]))
>>> eigenvalues
array([1.+1.j, 1.-1.j])
>>> eigenvectors
array([[0.70710678+0.j        , 0.70710678-0.j        ],
       [0.        -0.70710678j, 0.        +0.70710678j]])

具有实特征值(但具有复特征向量)的复值矩阵;请注意 a.conj().T == a,即 a 是厄米特矩阵。

>>> a = np.array([[1, 1j], [-1j, 1]])
>>> eigenvalues, eigenvectors = LA.eig(a)
>>> eigenvalues
array([2.+0.j, 0.+0.j])
>>> eigenvectors
array([[ 0.        +0.70710678j,  0.70710678+0.j        ], # may vary
       [ 0.70710678+0.j        , -0.        +0.70710678j]])

注意舍入误差!

>>> a = np.array([[1 + 1e-9, 0], [0, 1 - 1e-9]])
>>> # Theor. eigenvalues are 1 +/- 1e-9
>>> eigenvalues, eigenvectors = LA.eig(a)
>>> eigenvalues
array([1., 1.])
>>> eigenvectors
array([[1., 0.],
       [0., 1.]])