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.shapeObrigado!
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.