python'da numpy.linalg.eig kullandıktan sonra özdeğerleri ve ilişkili özvektörleri sıralayın


95

Özdeğerlerin ve özvektörlerin bir listesini elde etmek için numpy.linalg.eig kullanıyorum:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

Özdeğerlerimi (örneğin en düşükten en yükseğe) sıralamak istiyorum, bir şekilde sınıflandırmadan sonra ilişkili özvektörün ne olduğunu biliyorum.

Bunu python işlevleriyle yapmanın herhangi bir yolunu bulamıyorum. Herhangi bir basit yol var mı yoksa sıralama versiyonumu kodlamam gerekiyor mu?

Yanıtlar:


154

Numpy.argsort kullanın . Diziyi sıralamak için kullanılacak indisleri döndürür.

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]

Özdeğerler karmaşıksa, sıralama düzeni sözlükbilimseldir (yani karmaşık sayılar ilk önce gerçek bölümlerine göre sıralanır, bağları hayali kısımlarından koparılır).


27
Bu arada, en büyükten en küçüğe doğru sıralamak daha yaygındır. Sadece kullanım: idx = eigenValues.argsort()[::-1].
Carl F.

5
k en büyük özdeğer elde etmek için k = 2 idx = eigenValues.argsort () [- k:] [:: - 1]
mrgloom

3
K = 1 için kullanılabilireigenVectors[:, eigenValues.argmax()]
utapyngo

1
@MaxNoe: Dokümanlara göre , "Özdeğerler mutlaka sıralı değildir."
unutbu

2
Ah, sekiz kullanıyordum: Artan sıradaki özdeğerler, her biri çokluğuna göre tekrarlandı.
MaxNoe

6

Yukarıdaki unutbu cevabı çok net ve özlü. Ancak, bunu daha genel ve listeler için de kullanabileceğimiz başka bir yol.

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)

Bu tup [0], sıralama fonksiyonunun listeyi sıralayacağı özdeğerdir.

reverse = False, siparişi artırmak içindir.


1

Ubuntu'nun kod parçası Python 3.6.5'imde çalışmıyor. Çalışma zamanı hatalarına yol açar. Bu yüzden, kodunu test durumlarımda iyi çalışan şuna yeniden düzenledim:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.