Почему функция set для массива numpy возвращает немного другие значения? - PullRequest
0 голосов
/ 29 марта 2020

Мне пришлось проверить, имеет ли матрица собственное значение с кратностью> 1 или нет. Используя функцию eig numpy, я получил массив и преобразовал его в набор, который должен удалить повторяемое собственное значение и сравнивая длину списка и множества, мы можем сделать вывод, есть ли повторяющиеся собственные значения или нет. Код приведены ниже -

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 и операция set должна сделать его {2,4}. Но он конвертирует один 2 в 2.0000000000000009, а другой - в 1.9999999999999998 и делает их кажущимися отличными.

Я знаю, что могут быть другие более длинные методы, использующие цикл / счетчик для проверки четкости собственных значений, но почему это происходит?

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Как предлагает @ Johan C, вы можете использовать библиотеку 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")
0 голосов
/ 29 марта 2020

Я только что узнал, что это также можно сделать без использования numpy путем преобразования значений типа float / complex в строку и сравнения строк (хотя и не очень эффективно) -

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"
...