Chcę iteracyjne nad rzędami CSR Matrix i podzielić każdy element o sumę rzędu, podobny do tego tutaj:Duży Numpy scipy CSR Matrix, wiersz mądry operacja
Mój problem jest to, że mam do czynienia z dużą matrycą: (96582, 350138)
I kiedy stosuję operację z połączonego postu, to on wyostrza moją pamięć, ponieważ zwrócona macierz jest gęsta.
Więc tutaj jest moja pierwsza próba:
for row in counts:
row = row/row.sum()
Niestety to nie wpływa na matrycę w ogóle, więc wpadłem na pomysł z drugiej stworzyć nową matrycę CSR i concat wierszy przy użyciu vstack:
from scipy import sparse
import time
start_time = curr_time = time.time()
mtx = sparse.csr_matrix((0, counts.shape[1]))
for i, row in enumerate(counts):
prob_row = row/row.sum()
mtx = sparse.vstack([mtx, prob_row])
if i % 1000 == 0:
delta_time = time.time() - curr_time
total_time = time.time() - start_time
curr_time = time.time()
print('step: %i, total time: %i, delta_time: %i' % (i, total_time, delta_time))
działa to dobrze, ale po kilku iteracjach robi się coraz wolniej:
step: 0, total time: 0, delta_time: 0
step: 1000, total time: 1, delta_time: 1
step: 2000, total time: 5, delta_time: 4
step: 3000, total time: 12, delta_time: 6
step: 4000, total time: 23, delta_time: 11
step: 5000, total time: 38, delta_time: 14
step: 6000, total time: 55, delta_time: 17
step: 7000, total time: 88, delta_time: 32
step: 8000, total time: 136, delta_time: 47
step: 9000, total time: 190, delta_time: 53
step: 10000, total time: 250, delta_time: 59
step: 11000, total time: 315, delta_time: 65
step: 12000, total time: 386, delta_time: 70
step: 13000, total time: 462, delta_time: 76
step: 14000, total time: 543, delta_time: 81
step: 15000, total time: 630, delta_time: 86
step: 16000, total time: 722, delta_time: 92
step: 17000, total time: 820, delta_time: 97
Jakieś sugestie? Masz pomysł, dlaczego vstack działa wolniej i wolniej?
Zobacz https://stackoverflow.com/a/45339754 i https://stackoverflow.com/q/44080315 – hpaulj
Podobnie jak w przypadku gęstych tablic, powtórne konkatenacje w pętli są powolne. Nagromadzenie wyników na liście i wykonanie jednego 'vstack' jest szybsze. – hpaulj