大矩阵对角化python

时间:2015-10-09 11:53:51

标签: python

我在scipy中使用linalg来获得155X156矩阵的egenvalues和eigenvectors。然而,特征值的顺序似乎是随机的,与矩阵相关。我希望第一个特征值对应于矩阵中的第一个数字。请看我的日常工作。我是第一次读取包含所有浮点数的文件(1_1o.dat)2533297.650278 -2373859.531153 37695.845843 425449.129032 ...,然后我将它们作为数组读取[2533297.650278,-2373859.531153,37695.845843,425449.129032 ...]然后重塑为156X156矩阵。我想要按照读取矩阵的顺序打印所有特征值和相应的特征向量。我知道最后我的特征值(156个数字)应该从当前例程的小数字到较高数字列出。当然,相应的特征向量的顺序相同。任何人都可以帮我这个吗?感谢。

from scipy import linalg
from scipy.linalg import *
file2 = open('1_1f.dat', 'w')                                   
with open('1_1o.dat', 'rU') as file:                            
    File = file.readlines()                                     
    nums2 = np.array(File)                                         
    nums2 = [float(i.rstrip('\n')) for i in nums2[0].split()]  
    nums2 = np.reshape(nums2, (156, 156))
    print eig(nums2)    
    print >> file2, eig(nums2)                         
    file2.close()   

1 个答案:

答案 0 :(得分:1)

根据np.linalg.eig部分的文件:返回,w:(...,M)数组:

  

特征值,每个都根据其多样性重复。 特征值不一定是。结果数组将始终是复杂类型。当a为真时,得到的特征值将是实数(0虚部)或出现在共轭对中

如何对值进行排序,显示here并复制完整性:

import numpy as np
A = np.array([[3,1,-1], [1,3,-1], [-1,-1,5]])
w,v =  np.linalg.eig(A)
print w
idx = w.argsort()[::-1] #large to small
# idx = w.argsort() #small to large
w = w[idx]
v = v[:,idx]
print w # now they are ordered and you can iterate through your results to write them to your file