scipy.sparse n'est pas optimisé pour les opérations internes du produit

import timeit
import numpy as np
import scipy as sp

def getSparse(length, size, todense = False):
    array = np.random.random_integers(0, size - 1, length)
    response =  scipy.sparse.csr_matrix(([1]*len(array), array,range(len(array) + 1)), shape=(len(array),size), dtype = array.dtype)
    return response.todense() if todense else response

def testDense():
	x = np.dot(np.random.rand(300000).reshape(300, 1000), getSparse(1000,300, True))

def testSparse():
	x = np.dot(np.random.rand(300000).reshape(300, 1000), getSparse(1000,300, False))

print(timeit.timeit(testDense, setup = 'import __main__', number = 1))
# 0.08102297782897949
print(timeit.timeit(testSparse, setup = 'import __main__', number = 1))
# 30.572995901107788

Je m'attendais à ce que l'opération par points soit plus rapide en utilisant la matrice clairsemée, mais c'était horriblement lent. En théorie, cela ne devrait pas être étrange que cela devienne plus rapide, mais il semble que l'implémentation ne le supporte pas.

En passant, ce que je veux vraiment faire est d'agréger les valeurs d'une dimension particulière du ndarray. Par exemple, un traitement qui change les données dont la dimension est (magasin x date) en (région x date). Dans mon cas d'utilisation, il était bien de calculer normalement avec la matrice dense, mais lorsque plus de données sont ajoutées, cette caractéristique semble être un problème.

Recommended Posts

scipy.sparse n'est pas optimisé pour les opérations internes du produit
Le sous-système Windows pour Linux ne s'affiche pas