Для данной разреженной матрицы, как я могу умножить ее на заданный вектор двоичных значений - PullRequest
0 голосов
/ 29 мая 2018

У меня есть разреженная матрица и другой вектор, и я хочу умножить матрицу и вектор так, чтобы каждый столбец вектора, где он равен нулю, обнулял весь столбец разреженной матрицы.

Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Основная проблема - размер вашей проблемы и тот факт, что вы используете Python, который в 10-100 раз медленнее для умножения матриц, чем некоторые другие языки.Если вы не используете что-то вроде Cython, я не вижу улучшения.

0 голосов
/ 06 июня 2018

Если вам не нравится скорость умножения матриц, то вам следует рассмотреть вопрос об изменении атрибутов матрицы напрямую.Но в зависимости от формата, который может быть медленнее.

К zero-out столбцам csr, вы можете найти соответствующие ненулевые элементы и установить значения data в ноль.Затем запустите метод eliminate_zeros, чтобы удалить эти элементы из разреженной структуры.

Установка столбцов формата csc может быть проще - найдите соответствующее значение в indptr.По крайней мере элементы, которые вы хотите удалить, будут сгруппированы вместе.Я не буду вдаваться в подробности.

Обнуление строк в формате lil должно быть довольно простым - замените соответствующие списки на [].

В любом случае со знакомостью форматов этоДолжна быть возможность разработать альтернативы умножению матриц.Но не делая этого, а иногда делая, я мог бы сказать, какие из них быстрее.

0 голосов
/ 29 мая 2018

Вы ничего не упомянули о том, как определяются массив и матрица, можно предположить, что это numpy матрица и массив ... Вы имеете в виду что-то вроде следующего?

import numpy as np
from scipy.sparse import csr_matrix

A = csr_matrix([[1, 2, 0], [0, 0, 3], [4, 0, 5]])
v = np.array([1, 0, 1])
print(A.dot(v))

если так, посмотрите здесь:

https://docs.scipy.org/doc/scipy/reference/sparse.html

...