अजगर में numpy.linalg.eig का उपयोग करने के बाद eigenvalues ​​और संबंधित eigenvectors को सॉर्ट करें


94

मैं eigenvalues ​​और eigenvectors की सूची प्राप्त करने के लिए numpy.linalg.eig का उपयोग कर रहा हूं:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

मैं अपने eigenvalues ​​(जैसे निम्नतम से उच्चतम तक) को सॉर्ट करना चाहता हूं, एक तरह से मुझे पता है कि सॉर्टिंग के बाद संबंधित आइजन्वेक्टर क्या है।

मैं अजगर कार्यों के साथ ऐसा करने का कोई तरीका नहीं ढूंढ रहा हूं। क्या कोई सरल तरीका है या क्या मुझे अपने सॉर्ट संस्करण को कोड करना है?

जवाबों:


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]

यदि eigenvalues ​​जटिल हैं, तो सॉर्ट क्रम lexicographic है (अर्थात, जटिल संख्याओं को पहले उनके वास्तविक भाग के अनुसार क्रमबद्ध किया जाता है, साथ ही उनके काल्पनिक भाग से टूट जाता है)।


27
संयोग से, यह सबसे बड़े से लेकर सबसे छोटे ईगेंवल्यू तक छांटना अधिक आम है। सिर्फ उपयोग: idx = eigenValues.argsort()[::-1]
कार्ल एफ

5
k सबसे बड़ा eigenvalues ​​पाने के लिए k = 2 idx = eigenValues.argsort () [- k:] [:: - 1]
mrgloom

3
K = 1 के लिए एक उपयोग कर सकते हैंeigenVectors[:, eigenValues.argmax()]
utapyngo

1
@MaxNoe: डॉक्स के अनुसार , " प्रतिध्वनी आवश्यक नहीं हैं।"
अनटुबु

2
आह, मैं eigh का उपयोग कर रहा था: आरोही क्रम में eigenvalues, प्रत्येक अपनी बहुलता के अनुसार दोहराया।
मैक्सनो

6

अनटूटू द्वारा उपरोक्त उत्तर बहुत ही कुरकुरा और संक्षिप्त है। लेकिन, यहां एक और तरीका है कि हम इसे कर सकते हैं जो अधिक सामान्य है और इसका उपयोग सूचियों के लिए भी किया जा सकता है।

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] ईजेंवल्यू है जिसके आधार पर सॉर्ट फ़ंक्शन सूची को सॉर्ट करेगा।

उल्टा = झूठ बढ़ते आदेश के लिए है।


1

उबंटु के कोड का टुकड़ा मेरे पायथन 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.