You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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]

这正好就是你说的正确特征向量!

提取特征向量的两种方式

  1. 直接按列提取(推荐,符合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]
    
  2. 转置后按行提取(如果你习惯用行向量存储):
    如果你更希望每一行对应一个特征向量,只需要对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:50:19