сортувати власні значення та пов'язані з ними власні вектори після використання numpy.linalg.eig у python


94

Я використовую numpy.linalg.eig для отримання списку власних значень та власних векторів:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

eigenValues = solution[0]
eigenVectors = solution[1]

Я хотів би відсортувати власні значення (наприклад, від найнижчого до найвищого), таким чином, я знаю, що таке асоційований власний вектор після сортування.

Я не знаходжу жодного способу зробити це за допомогою функцій python. Чи є якийсь простий спосіб, чи мені потрібно кодувати мою версію сортування?

Відповіді:


153

Використовуйте numpy.argsort . Він повертає індекси, які можна використовувати для сортування масиву.

import numpy as np
import numpy.linalg as linalg

A = np.random.random((3,3))
eigenValues, eigenVectors = linalg.eig(A)

idx = eigenValues.argsort()[::-1]   
eigenValues = eigenValues[idx]
eigenVectors = eigenVectors[:,idx]

Якщо власні значення складні, порядок сортування лексикографічний (тобто комплексні числа сортуються спочатку відповідно до їх дійсної частини, з розривами, розірваними їх уявною частиною).


27
До речі, частіше сортують від найбільшого до найменшого власного значення. просто використовувати: idx = eigenValues.argsort()[::-1].
Карл Ф.

5
отримати k найбільших власних значень k = 2 idx = eigenValues.argsort () [- k:] [:: - 1]
mrgloom

3
Для k = 1 можна використовуватиeigenVectors[:, eigenValues.argmax()]
utapyngo

1
@MaxNoe: Відповідно до документів , "власні значення не обов'язково впорядковуються".
unutbu

2
Ах, я використовував вісім: власні значення у порядку зростання, кожне повторюється відповідно до своєї кратності.
MaxNoe

6

Відповідь вище від unutbu дуже чітка та стисла. Але ось ще один спосіб, як ми можемо це зробити, який є більш загальним і може бути використаний для списків.

eval, evec =  sp.eig(A)
ev_list = zip( eval, evec )
ev_list.sort(key=lambda tup:tup[0], reverse=False)
eval, evec = zip(*ev_list)

Ця сукупність [0] - власне значення, на основі якого функція сортування буде сортувати список.

reverse = False - для збільшення порядку.


1

Шматок коду ubuntu не працює на моєму Python 3.6.5. Це призводить до помилок під час виконання. Отже, я переробив його / її код на цей, який добре працює у моїх тестових випадках:

import numpy as np
from numpy import linalg as npla
#
def eigen(A):
    eigenValues, eigenVectors = npla.eig(A)
    idx = np.argsort(eigenValues)
    eigenValues = eigenValues[idx]
    eigenVectors = eigenVectors[:,idx]
    return (eigenValues, eigenVectors)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.