给定一个矩阵arr和一个向量vec,如果vec是arr的特征向量,那么:
np.dot(arr, vec) == lambda_ * vec
因此,遍历np.dot(arr, vec) / vec 的所有值(最终忽略作为潜在特征向量的空向量,并抑制潜在除以零的错误),将揭示特征值:
import numpy as np
def find_eigenvalue(arr, vec):
result = None
if not np.all(np.isclose(vec, 0.0)):
with np.errstate(divide='ignore', invalid='ignore'):
for x, y in zip(np.dot(arr, vec), vec):
if np.isclose(y, 0.0) and np.isclose(x, 0.0):
continue
if result is None:
result = x / y
elif not np.isclose(result, x / y):
result = None
break
return result
按预期工作:
print(find_eigenvalue(arr, np.array([0, 0, 0])))
# None
print(find_eigenvalue(arr, np.array([1, 0, 0])))
# None
print(find_eigenvalue(arr, np.array([0, 1, 0])))
# None
print(find_eigenvalue(arr, np.array([0, 0, 1])))
# None
print(find_eigenvalue(arr, np.array([0, -1, 2])))
# 5
print(find_eigenvalue(arr, np.array([-5, 2, 1])))
# -0.0
print(find_eigenvalue(arr, np.array([1, 2, 1])))
# 6.0
最后,请注意np.linalg.svd() 也会计算所有这些:
u, s, vh = np.linalg.svd(arr)
和s 将包含特征值,u 和vh 将包含特征向量(更准确地说,u 中的左奇异特征向量和vh 中的右奇异特征向量的厄米特) .