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
實對稱或複 Hermitian(共軛對稱)陣列的特徵值。
scipy.linalg.eig
SciPy 中類似的函式,也解決廣義特徵值問題。
scipy.linalg.schur
酉矩陣和其他非 Hermitian 正規矩陣的最佳選擇。
註解
廣播規則適用,詳情請參閱
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
是對角矩陣。對於非 Hermitian 正規矩陣,SciPy 函式
scipy.linalg.schur
是首選,因為矩陣 eigenvectors 保證是酉矩陣,而使用eig
時則不然。Schur 分解產生一個上三角矩陣而不是對角矩陣,但對於正規矩陣,只需要上三角矩陣的對角線,其餘的是捨入誤差。最後,強調 eigenvectors 由 a 的右(如右手邊)特徵向量組成。滿足
y.T @ a = z * y.T
的向量 y 對於某個數字 z 稱為 a 的左特徵向量,並且一般來說,矩陣的左特徵向量和右特徵向量不一定是彼此的(可能共軛)轉置。參考文獻
G. Strang,《線性代數及其應用》,第二版,奧蘭多,佛羅里達州,學術出版社公司,1980 年,各頁。
範例
>>> 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 是 Hermitian 矩陣。>>> 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.]])