python - 为什么 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,并使它们看起来不同。
我知道,可以有其他更长的方法使用循环/计数器来检查特征值的独特性,但是为什么会发生这种情况?
解决方案
正如@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")
推荐阅读
- vue.js - Vue 重定向。我的代码是注意重定向到我想要的页面
- javascript - 在 JSP 中创建模式对话框并执行 POST 操作
- reactjs - 强制 SPA 添加到主屏幕弹出窗口即使在添加到主屏幕后也会显示
- docker - docker-compose,在不启动容器的情况下重建图像
- oracle - 我们应该何时以及如何为存储过程(Oracle DB)的执行编写应用程序日志?
- c++ - 有向图 - 如何计算图中每个其他顶点可到达的顶点数?
- scala - 定期发送请求
- vba - 如何在 Word-VBA Userform 中将复选框从第 1 页移动到多页 1 的第 2 页?
- java - 如何修复 RN 中的“无法转换为 java.lang.String”?
- python - Pygame,同一组中的2个对象之间的碰撞