J'ai deux scipy_sparse_csr_matrix 'a' et scipy_sparse_csr_matrix (boolean) 'masque', et je veux mettre les éléments de 'a' à zéro où élément du masque est vrai.Méthode efficace pour mettre les éléments à zéro où masque est vrai sur matrice scipy vide
par exemple
>>>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)
Ensuite, je veux obtenir le résultat suivant.
>>>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]])
je peux le faire par l'opération comme
result = a - a.multiply(mask)
ou
a -= a.multiply(mask) #I don't care either in-place or copy.
Mais je pense que les opérations ci-dessus sont inefficaces. Puisque la forme réelle de 'a' et de 'mask' est de 67.108.864 × 2.000.000, ces opérations prennent plusieurs secondes sur un serveur à haute spécification (64 cœurs Xeon, 512 Go de mémoire). Par exemple, 'a' a environ 30 000 000 éléments non nuls, et 'mask' a environ 1 800 000 éléments non-True (True), alors l'opération ci-dessus prend environ 2 secondes.
Existe-t-il un moyen plus efficace de le faire?
Les conditions sont ci-dessous.
- a.getnnz()! = Mask.getnnz()
- a.shape = mask.shape
Merci!
Autre moyen (essayé)
a.data*=~np.array(mask[a.astype(np.bool)]).flatten();a.eliminate_zeros() #This takes twice the time longer than above method.
Comment les 'nnz' de' a' et 'mask' se comparent-ils? En plus d'être pas la même chose. Les deux sont également clairsemés? – hpaulj
Merci pour votre réponse, @hpaulj! Je suis désolé de vous confondre. La condition 1 signifie seulement 'Le nombre d'éléments non différents (faux) du masque est différent du nombre d'éléments de a'. – hiroto1228