Эффективный способ установить элементы в ноль, где маска равна 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.