скалярные произведения на разреженных матрицах

Я пытаюсь взять точечный продукт строки в разреженной матрице с транспонированием этой строки с помощью Python. У меня есть огромная разреженная матрица под названием X2. И я сохраняю результаты (которые должны быть одним числом) в списке под названием Njc.

    X2 = X.transpose()
    for row in X2:
        Njc.append(dot(row,row.transpose()))

Однако, когда я запускаю свою программу, результаты не являются отдельными числами. Они выглядят так: (0, 0) 355

(0, 0) 295

(0, 0) 15

(0, 0) 204

(0, 0) 66

....

К сожалению, моя разреженная матрица настолько велика, что я не могу превратить ее в плотную матрицу (моя память взорвется). Есть ли способ получить только числа справа без пар слева?


person BBB    schedule 18.11.2012    source источник
comment
из любопытства, насколько велика матрица?   -  person will    schedule 19.11.2012
comment
это 1 миллион на 10 тысяч   -  person BBB    schedule 19.11.2012


Ответы (1)


dot возвращает разреженную матрицу. Чтобы выбрать одно значение внутри разреженной матрицы, вы можете использовать .todense().item():

Njc.append((np.dot(row, row.transpose())).todense().item())
person unutbu    schedule 18.11.2012
comment
почему я не могу этого сделать? Я также выполняю точечные операции с разреженной матрицей, но когда я делаю «todense», это дает мне ошибку, что объект ndarray не имеет атрибута «todense». - person blenzcoffee; 01.12.2012
comment
@dsutandi: разреженная матрица SciPy не является NumPy ndarray. Ваша матрица может быть разреженной в математическом смысле, но она не является разреженной матрицей SciPy. - person unutbu; 01.12.2012