У меня есть разреженная матрица в формате csr_matrix. Для каждой строки мне нужно вычесть среднее значение строки из ненулевых элементов. Средство должно вычисляться по числу ненулевых элементов строки (вместо длины строки). я нашел быстрый способ вычисления строки означает, что с помощью следующего кода:scipy.sparse matrix: вычитание строки означает ненулевые элементы
# M is a csr_matrix
sums = np.squeeze(np.asarray(M.sum(1))) # sum of the nonzero elements, for each row
counts = np.diff(M.tocsr().indptr) # count of the nonzero elements, for each row
# for the i-th row the mean is just sums[i]/float(counts[i])
Проблемы является частью обновления. Мне нужен быстрый способ сделать это. На самом деле то, что я делаю, чтобы превратить М в lil_matrix и выполнять обновления таким образом:
M = M.tolil()
for i in xrange(len(sums)):
for j in M.getrow(i).nonzero()[1]:
M[i, j] -= sums[i]/float(counts[i])
, который медленно. Любое предложение для более быстрого решения?
Я попытался бы повторить разграничение строк с помощью 'np.repeat' и' counts' и sub, которые непосредственно из массива 'M.data'. – hpaulj