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.