我目前正在尝试按元组列表排序元组,但是我收到错误:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
这是我的代码:
def eigen_calc(S):
eig_val, eig_vec = LA.eig(S)
eig_pairs = [(np.abs(eig_val[i]), eig_vec[:, i]) for i in range(len(eig_val))]
eig_pairs.sort(reverse=True)
其中输入S
是我的经验协方差矩阵,其维度为(21, 21)
。
答案 0 :(得分:2)
您可以将key=
keyword argument传递给sort
方法:
eig_pairs.sort(reverse=True, key=(lambda x: x[0]))
lambda
函数只抓取每个(eig_val, eig_vec)
对中的第一个元素,这意味着元组按特征值幅度的降序排序。
直接处理numpy数组通常要快得多,而不是转换为普通的Python对象,如列表和元组。
更好的解决方案是简单地调用np.argsort
以使得特征值的索引按照数量级的升序,反转索引的顺序,然后使用它们来索引特征值和列的向量特征向量矩阵:
# get the array of indices that would sort `eig_val` in ascending order of
# magnitude
asc_order = np.argsort(np.abs(eig_val))
# reverse the order of the indices using slice indexing
desc_order = asc_order[::-1]
# sort eigenvalues and eigenvectors using this index array
sorted_eig_val = eig_val[desc_order]
sorted_eig_vec = eig_vec[:, desc_order]
另一个小问题:如果S
是协方差矩阵,那么它应该是对称的,因此您可以使用np.linalg.eigh
,这对于Hermitian或对称矩阵比np.linalg.eig
更快。