numpy.linalg.eig#
- linalg.eig(a)[源代码]#
计算一个方阵的特征值和右特征向量.
- 参数:
- a(…, M, M) 数组
将计算其特征值和右特征向量的矩阵
- 返回:
- 一个具有以下属性的命名元组:
- eigenvalues(…, M) 数组
特征值,每个根据其重数重复.特征值不一定是有序的.结果数组将是复数类型,除非虚部为零,在这种情况下它将被转换为实数类型.当 a 是实数时,得到的特征值将是实数(虚部为0)或成共轭对出现.
- eigenvectors(…, M, M) 数组
归一化(单位”长度”)的特征向量,使得列
eigenvectors[:,i]
是对应于特征值eigenvalues[i]
的特征向量.
- 引发:
- LinAlgError
如果特征值计算不收敛.
参见
eigvals
非对称数组的特征值.
eigh
实对称或复 Hermitian(共轭对称)数组的特征值和特征向量.
eigvalsh
实对称或复共轭对称数组的特征值.
scipy.linalg.eig
SciPy 中类似的函数,也解决广义特征值问题.
scipy.linalg.schur
单体和其他非厄米正则矩阵的最佳选择.
备注
在 1.8.0 版本加入.
广播规则适用,详情请参见
numpy.linalg
文档.这是使用
_geev
LAPACK 例程实现的,这些例程计算一般方阵的特征值和特征向量.数字 w 是 a 的特征值,如果存在一个向量 v 使得
a @ v = w * v
.因此,数组 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
的向量 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.]])