为什么numpy数组上的set函数返回的值略有不同?

2024-06-17 13:32:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须检查矩阵是否具有重数特征值>;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"

我得到的结果是“All distinct”,为了检查,我做了-print set(eig(A)[0]),得到了

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

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


Tags: 函数代码gtnumpy列表len矩阵数组
2条回答

我刚刚发现,通过将浮点/复数值转换为字符串并比较字符串(尽管效率不高),也可以在不使用numpy的情况下实现这一点

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

正如@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")

相关问题 更多 >