Python Numpy特征向量排序错误

时间:2015-04-09 11:02:56

标签: python sorting numpy

我目前正在尝试按元组列表排序元组,但是我收到错误:

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)

1 个答案:

答案 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更快。