首页 > 解决方案 > 为什么 numpy 数组上的 set 函数返回略有不同的值?

问题描述

我必须检查矩阵是否具有多重性> 1的特征值。使用numpy的eig函数我得到一个数组并将其转换为集合,它应该删除重复的特征值并比较列表和集合的长度,我们可以推断是否存在重复的特征值。代码如下 -

from numpy.linalg import eig
A=[[3,1,1],[2,4,2],[-1,-1,1]]
if len(eig(A)[0])!=len(set(eig(A)[0])):
    print "Multiple eigenvalues found!"
else:
    print "All distinct"

我得到的结果是“所有不同的”,并检查我print set(eig(A)[0])做了 - 并得到了

>>>set([2.0000000000000009, 1.9999999999999998, 3.9999999999999982]) 特征值是 2,2,4 并且集合操作必须使它成为 {2,4}。但是它将一个 2 转换为 2.0000000000000009 和另一个转换为 1.99999999999999998,并使它们看起来不同。

我知道,可以有其他更长的方法使用循环/计数器来检查特征值的独特性,但是为什么会发生这种情况?

标签: pythonnumpymathsetscientific-computing

解决方案


正如@JohanC 所建议的,您可以使用 sympy 库,特别是这里可能的实现:

from sympy import Matrix
import numpy as np
A=[[3,1,1], [2,4,2], [-1,-1,1]]
M = Matrix(A)

# Create array with eigenvalues multiplicities
mults = np.array([m for m in M.eigenvals().values()])

if np.any(mults>1):
    print("Multiple eigenvalues found!")
else:
    print("All distinct")

推荐阅读