Maneira eficiente de definir elementos como zero, onde a máscara é True na matriz esparsa e pontiaguda

Eu tenho dois scipy_sparse_csr_matrix 'a' e scipy_sparse_csr_matrix (booleano) 'mask' e quero definir os elementos de 'a' para zero, onde o elemento da máscara é True.

por exemplo

>>>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)

Então eu quero obter o seguinte resultado.

>>>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]])

Eu posso fazer isso por operação como

result = a - a.multiply(mask)

ou

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

Mas acho que as operações acima são ineficientes. Como a forma real de 'a' e 'máscara' é de 67.108.864 × 2.000.000, essas operações demoram vários segundos no servidor de alta especificação (cpu Xeon de 64 núcleos, 512GB de memória). Por exemplo, 'a' possui cerca de 30.000.000 de elementos diferentes de zero e 'mask' possui cerca de 1.800.000 de elementos diferentes de zero (True), e a operação acima leva cerca de 2 segundos.

Existe uma maneira mais eficiente de fazer isso?

As condições estão abaixo.

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

Obrigado!

Outro caminho (tentado)

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

questionAnswers(1)

yourAnswerToTheQuestion