Эффективный способ установить элементы в ноль, где маска равна True на скудной разреженной матрице

У меня есть два scipy_sparse_csr_matrix 'a' и scipy_sparse_csr_matrix (boolean) 'mask', и я хочу установить элементы 'a' в ноль, где элемент mask равен True.

например

>>>a
<3x3 sparse matrix of type '<type 'numpy.int32'>'
    with 4 stored elements in Compressed Sparse Row format>
>>>a.todense()
matrix([[0, 0, 3],
        [0, 1, 5],
        [7, 0, 0]])

>>>mask
<3x3 sparse matrix of type '<type 'numpy.bool_'>'
    with 4 stored elements in Compressed Sparse Row format>
>>>mask.todense()
matrix([[ True, False,  True],
        [False, False,  True],
        [False,  True, False]], dtype=bool)

Тогда я хочу получить следующий результат.

>>>result
<3x3 sparse matrix of type '<type 'numpy.int32'>'
    with 2 stored elements in Compressed Sparse Row format>
>>>result.todense()
matrix([[0, 0, 0],
        [0, 1, 0],
        [7, 0, 0]])

Я могу сделать это с помощью операции, как

result = a - a.multiply(mask)

или же

a -= a.multiply(mask) #I don't care either in-place or copy.

Но я считаю, что вышеуказанные операции неэффективны. Поскольку фактическая форма 'a' и 'mask' составляет 67 108 864 × 2 000 000, эти операции занимают несколько секунд на высокопроизводительном сервере (64-ядерный процессор Xeon, 512 ГБ памяти). Например, «а» имеет около 30 000 000 ненулевых элементов, а «маска» имеет около 1 800 000 ненулевых (истинных) элементов, тогда выполнение вышеуказанной операции займет около 2 секунд.

Есть ли более эффективный способ сделать это?

Условия ниже.

a.getnnz ()! = mask.getnnz ()a.shape = mask.shape

Спасибо!

Другой способ (пробовал)

a.data*=~np.array(mask[a.astype(np.bool)]).flatten();a.eliminate_zeros() #This takes twice the time longer than above method.

Ответы на вопрос(1)

Ваш ответ на вопрос