如何找出对应于矩阵特定特征值的特征向量?

AIB*_*AIB 5 python numpy scipy eigenvalue eigenvector

如何找出与特定特征值对应的特征向量?

我有一个随机矩阵(P),其中一个特征值是1.我需要找到对应于特征值1的特征向量.

scipy函数scipy.linalg.eig返回特征值和特征向量的数组.

D, V = scipy.linalg.eig(P)
Run Code Online (Sandbox Code Playgroud)

这里D(值的数组)和V(矢量的数组)都是矢量.

一种方法是在D中进行搜索并在V中提取相应的特征向量.有更简单的方法吗?

unu*_*tbu 5

import numpy as np
import numpy.linalg as linalg


P = np.array([[2, 0, 0], [0, 1, 0], [0, 0, 3]])

D, V = linalg.eig(P)
print(D)
# [ 2.  1.  3.]
Run Code Online (Sandbox Code Playgroud)

特征向量是V的列:

V = V.T

for val, vec in zip(D, V):
    assert np.allclose(np.dot(P, vec), val*vec)
Run Code Online (Sandbox Code Playgroud)

因此,对应于特征值1.0的特征向量是

def near(a, b, rtol = 1e-5, atol = 1e-8):
    return np.abs(a-b)<(atol+rtol*np.abs(b))

print(V[near(D, 1.0)])
# [[ 0.  1.  0.]]
Run Code Online (Sandbox Code Playgroud)

由于可以有多个具有相同特征值的特征向量,因此V[near(D, 1.0)]返回一个二维数组 - 该数组的每一行都是一个特征值为1.0的特征向量.


Nic*_*bey 5

如果您正在寻找对应于一个特征值的一个特征向量,使用eig 函数scipy.sparse.linalg 实现可能会更有效。它允许查找固定数量的特征向量并围绕特定值移动搜索。你可以做例如:

values, vectors = scipy.sparse.linalg.eigs(P, k=1, sigma=1)
Run Code Online (Sandbox Code Playgroud)