จัดเรียงค่าลักษณะเฉพาะและค่าลักษณะเฉพาะที่เกี่ยวข้องหลังจากใช้ numpy.linalg.eig ใน python


101

ฉันกำลังใช้ numpy.linalg.eig เพื่อรับรายการค่าลักษณะเฉพาะและค่าลักษณะเฉพาะ:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

ฉันต้องการจัดเรียงค่าลักษณะเฉพาะของฉัน (เช่นจากต่ำสุดไปสูงสุด) ในแบบที่ฉันรู้ว่า eigenvector ที่เกี่ยวข้องคืออะไรหลังจากการเรียงลำดับ

ฉันไม่พบวิธีการทำเช่นนั้นกับฟังก์ชัน python มีวิธีง่ายๆหรือฉันต้องเขียนโค้ดเวอร์ชันการเรียงลำดับของฉันหรือไม่?

คำตอบ:


162

ใช้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].
Carl F.

5
เพื่อให้ได้ค่าลักษณะเฉพาะที่ใหญ่ที่สุด k = 2 idx = eigenValues.argsort () [- k:] [:: - 1]
mrgloom

3
สำหรับ k = 1 สามารถใช้ได้eigenVectors[:, eigenValues.argmax()]
utapyngo

1
@MaxNoe: ตามเอกสาร "ค่าลักษณะเฉพาะไม่จำเป็นต้องเรียงลำดับ"
unutbu

2
อ่าฉันใช้ eigh: ค่าลักษณะเฉพาะตามลำดับจากน้อยไปมากแต่ละค่าซ้ำตามความหลายหลากของมัน
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)

tup [0] นี้คือค่าลักษณะเฉพาะที่ขึ้นอยู่กับฟังก์ชัน sort จะจัดเรียงรายการ

reverse = False ใช้สำหรับเพิ่มลำดับ


2

โค้ดของ 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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.