Как я могу умножить большие, более плотные матрицы scipy.sparse с эффективным использованием памяти, если я буду sh игнорировать маленькие значения? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть две большие матрицы scipy.sparse.csr_matrix. Я не могу их умножить, потому что мне не хватает памяти. Структура разреженности разрушается после точечного произведения из-за большого количества очень маленьких ненулевых значений. Можно спасти структуру разреженности, установив эти числа в ноль и вызвав eliminate_zeros, но это не сработает, когда у меня не хватит памяти.

Если я знаю, что я sh проигнорирую значения ниже a заранее определенное пороговое значение, как я могу использовать эту информацию? В настоящее время работает только один подход, который работает, но он очень медленный:

chunksize=10000
numiter = A.shape[0]//chunksize
CS=[]
for i in range(numiter):
    C = A[i*chunksize:(i+1)*chunksize].dot(B)
    C.data[C.data<0.1]=0
    C.eliminate_zeros()
    CS.append(C)
C=sp.sparse.hstack(CS)

Я вычисляю точечное произведение 10000 строк за раз и обнуляю значения меньше некоторого порогового значения (в этот случай 0,1). Таким образом, я могу построить полную матрицу без исчерпания памяти. Однако этот подход действительно медленный. Буду признателен за любые предложения!

...