вычисление суммы внешних произведений для разреженных матриц

Я пытаюсь реализовать следующее уравнение с использованием пакета 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

Эта реализация имеет следующие проблемы:

  1. Использование памяти, кажется, резко возрастает. Насколько я понимаю, память должна увеличиваться только по мере того, как c становится менее разреженным, но я вижу, что цикл начинает съедать> 20 ГБ памяти с an = 10 000, m = 100 000 (каждая строка x и y имеет только около 60 не- ноль элементов).

  2. Я использую цикл Python, который не очень эффективен.

Мой вопрос: есть ли лучший способ сделать это? Моя первая задача - контролировать использование памяти, но было бы здорово сделать это быстрее!

Спасибо!

6
задан RussellM 5 August 2011 в 20:07
поделиться