Я пытаюсь реализовать следующее уравнение с использованием пакета scipy sparse:
W = x[:,1] * y[:,1].T + x[:,2] * y[:,2].T + ...
где x и y - это nxm csc_matrix. В основном я пытаюсь умножить каждый столбец x на каждый столбец y и суммировать полученные матрицы nxn вместе. Затем я хочу сделать все ненулевые элементы равными 1.
Это моя текущая реализация:
c = sparse.csc_matrix((n, n))
for i in xrange(0,m):
tmp = bam.id2sym_thal[:,i] * bam.id2sym_cort[:,i].T
minimum(tmp.data,ones_like(tmp.data),tmp.data)
maximum(tmp.data,ones_like(tmp.data),tmp.data)
c = c + tmp
Эта реализация имеет следующие проблемы:
Использование памяти, кажется, резко возрастает. Насколько я понимаю, память должна увеличиваться только по мере того, как c становится менее разреженным, но я вижу, что цикл начинает съедать> 20 ГБ памяти с an = 10 000, m = 100 000 (каждая строка x и y имеет только около 60 не- ноль элементов).
Я использую цикл Python, который не очень эффективен.
Мой вопрос: есть ли лучший способ сделать это? Моя первая задача - контролировать использование памяти, но было бы здорово сделать это быстрее!
Спасибо!