পাইগনে numpy.linalg.eig ব্যবহারের পরে ইগেনভ্যালুগুলি এবং সম্পর্কিত আইজেনভেেক্টরগুলিকে বাছাই করুন


95

আমি ইগেনভ্যালু এবং ইগেনভেেক্টরগুলির একটি তালিকা পেতে numpy.linalg.eig ব্যবহার করছি:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

আমি আমার ইগেনভ্যালুগুলি (যেমন নীচে থেকে সর্বোচ্চ পর্যন্ত) বাছাই করতে চাই, একরকমভাবে আমি জানি যে বাছাইয়ের পরে সম্পর্কিত ইগেনভেেক্টরটি কী।

পাইথন ফাংশন দিয়ে আমি এটি করার কোনও উপায় খুঁজে পাচ্ছি না। কোন সহজ উপায় আছে বা আমি আমার সাজানোর সংস্করণ কোড করতে হবে?

উত্তর:


154

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]

যদি ইগেনভ্যালুগুলি জটিল হয়, তবে সাজানোর ক্রমটি অভিধানিক (যা জটিল সংখ্যাকে প্রথমে তাদের বাস্তব অংশ অনুসারে বাছাই করা হয়, যার সাথে তাদের কল্পিত অংশটি ভেঙে দেওয়া হয়) is


27
ঘটনাক্রমে, বৃহত্তম থেকে ক্ষুদ্রতম ইগুভ্যালুতে সাজানো আরও সাধারণ। শুধু ব্যবহার: idx = eigenValues.argsort()[::-1]
কার্ল এফ।

4
k বৃহত্তম eigenvalues ​​পেতে k = 2 idx = eigenValues.argsort () [- কে:] [:: - 1]
মৃগলুম

4
কে = 1 এর জন্য একটি ব্যবহার করতে পারেনeigenVectors[:, eigenValues.argmax()]
utapyngo

4
@ ম্যাক্সনো: দস্তাবেজগুলিতে , "ইগেনভ্যালুগুলি প্রয়োজনীয়ভাবে অর্ডার করা হয় না।"
আনটবু

4
আহ, আমি আটটি ব্যবহার করছিলাম: আরোহী ক্রমে এগেনভ্যালুগুলি, প্রতিটি তার গুণমান অনুসারে পুনরাবৃত্তি করেছে।
ম্যাক্সনয়ে

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] হ'ল ইগেনভ্যালু যার উপর ভিত্তি করে বাছাই করা ফাংশন তালিকাটিকে সাজান sort

বিপরীত = মিথ্যা হ'ল ক্রম বাড়ানোর জন্য।


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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.