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