python:基于特征值的多样性修改特征向量

时间:2017-09-21 21:40:32

标签: python python-2.7 numpy eigenvalue eigenvector

对于具有eigevalues eigval和eigevectors eigvec的给定矩阵A,这是我想要做的:

  1. 找到具有多重性的特征值> 1
  2. 找到相应的特征向量。对这些特征向量进行一些计算
  3. 使用这些新的向量替换旧的向量创建eigvec
  4. 最重要的是,如果有2个退化的特征值集合,每个具有乘法3,我希望分别处理两组特征向量。 这是我到目前为止所尝试的内容:

    import numpy as np
    import numpy.linalg as linalg
    A = [[1,0,0], [0, 1, 0], [6, 7, 3]]
    eigval, eigvec = linalg.eig(A)
    idx = eigval.argsort()[::-1]
    eigval = eigval[idx]
    eigvec = eigvec[:,idx]
    
    unique, counts,indices = np.unique(eigval,return_counts=True,return_index=True)
    
    uni_count = dict(zip(counts, indices))
    
    qr_counter = []
    
    for key,val in uni_count.items():
        if val > 1:
            qr_counter.append(key)
    
    print('For the dict: the key is the index, the value is mulplicity')
    
    non_unique_eigvec = np.empty((len(qr_counter),), dtype=object)
    
    for int in qr_counter:
        np.concatenate(non_unique_eigvec, eigvec[int])
    

    现在问题是eigvec是np数组,我不知道如何修改它。

    任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

您的错误的解决方案非常简单。如果您查看numpy.concatenate()的{​​{3}},您会看到输入参数是:

1。)要连接的数组的序列

2。)要连接的轴

因此要连接的数组必须简单地放入一个序列中,并作为单个对象传递给concatenate()。所以,

np.concatenate( (non_unique_eigvec, eigvec[int]) )

而不是

np.concatenate(non_unique_eigvec, eigvec[int])

您正在传递一个数组(eigvec[int])来代替一个参数而不是一个整数(第二个参数 - 轴)。

虽然一旦修复,就会生成数组

array([None, 0.0, 0.274721127897378, 0.0], dtype=object)

我怀疑你想要的是什么?

最后,您应该在较低的int循环中更改变量for的名称,因为int已经是Python中的重要关键字