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.eigSciPy 中类似的函数,还可以解决广义特征值问题。
scipy.linalg.schur对于酉矩阵和其他非厄米正规矩阵的最佳选择。
备注
应用广播规则,有关详细信息,请参阅
numpy.linalg文档。此函数使用
_geevLAPACK 例程实现,该例程计算一般方阵的特征值和特征向量。如果存在向量 v 使得
a @ v = w * v,则称数值 w 为 a 的特征值。因此,数组 a、eigenvalues 和 eigenvectors 满足方程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 分解产生的是上三角矩阵而不是对角矩阵,但对于正规矩阵,只需上三角矩阵的对角线部分,其余部分均为舍入误差。最后,需要强调的是 eigenvectors 由 a 的“右”(即右侧)特征向量组成。满足
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. + 0j, 2. + 0j, 3. + 0j]) >>> eigenvectors.real 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.+0j, 1.+0j]) >>> eigenvectors.real array([[1., 0.], [0., 1.]])