En realidad las rutinas escasos trabajan para las matrices numpy densas también, creo que utilizan algún tipo de Krylov iteración subespacio, por lo tanto necesitan para calcular varios matriz-vector productos, lo que significa que si su k < < N, el las rutinas dispersas podrían ser (¿marginalmente?) más rápido.
Mira la documentación http://docs.scipy.org/doc/scipy/reference/tutorial/arpack.html
y el siguiente código (van a tomar un buen café con los amigos hasta que termina)
import numpy as np
from time import clock
from scipy.linalg import eigh as largest_eigh
from scipy.sparse.linalg.eigen.arpack import eigsh as largest_eigsh
np.set_printoptions(suppress=True)
np.random.seed(0)
N=5000
k=10
X = np.random.random((N,N)) - 0.5
X = np.dot(X, X.T) #create a symmetric matrix
# Benchmark the dense routine
start = clock()
evals_large, evecs_large = largest_eigh(X, eigvals=(N-k,N-1))
elapsed = (clock() - start)
print "eigh elapsed time: ", elapsed
# Benchmark the sparse routine
start = clock()
evals_large_sparse, evecs_large_sparse = largest_eigsh(X, k, which='LM')
elapsed = (clock() - start)
print "eigsh elapsed time: ", elapsed
El método no era escasa método más rápido para mí. El uso de la escritura de referencia de Giuliano con k = 2 consigo eigh tiempo transcurrido: 93.704689 eigsh Tiempo transcurrido: 353.433379 EIG tiempo transcurrido: 870.060089 La última vez es para numpy.linalg.eig. Esto está en mi macbook pro. –