Я бы использовал np.linalg.eigh
, поскольку он предназначен для матриц с реальной симметрией c и будет использовать специальный алгоритм. Еще одним преимуществом является то, что возвращенные собственные значения сортируются в порядке возрастания, поэтому вам не нужно использовать argsort()
.
Сравнение скорости с N = 1010
, поэтому я не буду ждать вечно:
eig_vals, eig_vects = np.linalg.eig(S)
# 628 ms ± 45.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
eig_vals, eig_vects = np.linalg.eigh(S)
# 89.1 ms ± 2.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
from scipy import linalg as la
eig_vals, eig_vects = la.eigh(S)
# 346 ms ± 10.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
np.linalg.eigh
самый быстрый на сегодняшний день.