Mam dwie "scipy_sparse_csr_matrix" a "i scipy_sparse_csr_matrix (boolean)" maska "i chcę ustawić elementy" a "na zero, gdzie element maski jest prawdziwy.Wydajny sposób ustawiania elementów na zero, gdzie maska jest True na scipy rzadkiej macierzy
np
>>>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)
Następnie chcę uzyskać następujący wynik.
>>>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]])
mogę to zrobić przez działania jak
result = a - a.multiply(mask)
lub
a -= a.multiply(mask) #I don't care either in-place or copy.
Ale myślę, że powyższe działania są nieskuteczne. Ponieważ rzeczywisty kształt "a" i "maski" wynosi 67 108 864 × 2 000 000, operacje te wymagają kilku sekund na serwerze o wysokiej specyfikacji (64-rdzeniowy procesor Xeon, 512 GB pamięci). Na przykład "a" zawiera około 30 000 000 niezerowych elementów, a "maska" zawiera około 1 800 000 niezerowych (prawdziwych) elementów, a następnie wykonanie tej operacji zajmuje około 2 sekund.
Czy jest to skuteczniejszy sposób?
Warunki są poniżej.
- a.getnnz()! = Mask.getnnz()
- a.shape = mask.shape
Dzięki!
Inny sposób (próbowałem)
a.data*=~np.array(mask[a.astype(np.bool)]).flatten();a.eliminate_zeros() #This takes twice the time longer than above method.
Jak porównać 'nnz' z' a' i 'mask'? Poza tym nie być tym samym. Czy oba są równie skąpe? – hpaulj
Dziękuję za odpowiedź, @hpaulj! Przepraszam, że cię zmyliłem. Warunek 1 oznacza tylko "Liczba niezerowych (fałszywych) elementów maski różni się od liczby elementów a.". – hiroto1228