如何从numpy.linalg.eig的输出中提取正确的矩阵特征向量?
解决numpy.linalg.eig特征向量提取的困惑
嘿,我完全懂你的疑惑——numpy.linalg.eig的输出格式确实容易让人一开始摸不清门道!
核心问题解释
numpy.linalg.eig返回的vec矩阵,每一列才是对应特征值的特征向量,而不是你一开始以为的行。你看到的vec输出:
array([[ 0.70710678, -0.4472136 ], [-0.70710678, 0.89442719]])
其中:
- 第一列
vec[:, 0]就是对应第一个特征值val[0]的特征向量:[0.70710678, -0.70710678] - 第二列
vec[:, 1]就是对应第二个特征值val[1]的特征向量:[-0.4472136, 0.89442719]
这正好就是你说的正确特征向量!
提取特征向量的两种方式
直接按列提取(推荐,符合numpy的设计逻辑):
import numpy as np x = np.array([[0, 1], [-2, -3]]) val, vec = np.linalg.eig(x) # 获取第一个特征向量 eig_vec1 = vec[:, 0] # 获取第二个特征向量 eig_vec2 = vec[:, 1] print(eig_vec1) # 输出: [ 0.70710678 -0.70710678] print(eig_vec2) # 输出: [-0.4472136 0.89442719]转置后按行提取(如果你习惯用行向量存储):
如果你更希望每一行对应一个特征向量,只需要对vec做转置操作:vec_transposed = vec.T eig_vec1 = vec_transposed[0] eig_vec2 = vec_transposed[1]
验证正确性
可以简单验证一下,特征向量满足A·v = λ·v(A是原矩阵,λ是特征值,v是特征向量):
# 验证第一个特征向量 print(np.allclose(x @ eig_vec1, val[0] * eig_vec1)) # 输出: True # 验证第二个特征向量 print(np.allclose(x @ eig_vec2, val[1] * eig_vec2)) # 输出: True
用np.allclose是因为浮点计算存在微小误差,直接相等可能不成立,但近似相等就说明正确。
内容的提问来源于stack exchange,提问作者Subham Kumar
相关产品推荐
相关产品推荐

