2015-04-09 3 views
-1

В настоящее время я пытаюсь разобраться Кортеж список кортежей по их первому значению, но я получаю сообщение об ошибке:Python 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).

+0

'eig_pairs' выглядит как список 2-х кортежей, каждый кортеж содержит (numpy) float и массив. Я не думаю, что по умолчанию метод 'sort' может сортировать; вам нужно будет рассказать, как вы хотите сортировать вещи (то есть '<', '>' и '==' скорее всего не определены или несколько случайны для элементов 'eig_pairs'). – Evert

ответ

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, который быстрее для эрмитовых или симметричных матриц, чем np.linalg.eig.

+0

Спасибо, что сработал – VictorVH

Смежные вопросы