对于具有eigevalues eigval
和eigevectors eigvec
的给定矩阵A,这是我想要做的:
eigvec
最重要的是,如果有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数组,我不知道如何修改它。
任何帮助将不胜感激!谢谢!
答案 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中的重要关键字