Cięcie Sparse Matrices w Scipy - Które typy najlepiej działają?
The SciPySamouczek „Rzadka macierz” jest bardzo dobra - ale tak naprawdę pozostawia rozwiniętą sekcję na temat przecinania (dalej) (nadal w formie konspektu - patrz sekcja: „Obsługa rzadkich macierzy”).
Postaram się zaktualizować samouczek, gdy odpowie na to pytanie.
Mam dużą macierz rzadką - obecnie w formacie dok_matrix.
import numpy as np
from scipy import sparse
M = sparse.dok_matrix((10**6, 10**6))
Dla różnych metod chcę być w stanie ciąć kolumny i dla innych chcę ciąć wiersze. Najlepiej byłoby użyć zaawansowanego indeksowania (tj. Wektora logicznego,bool_vect
), za pomocą której wycina się rzadką matrycęM
-- jak w:
bool_vect = np.arange(10**6)%2 # every even index
out = M[bool_vect,:] # Want to select every even row
lub
out = M[:,bool_vect] # Want to select every even column
Po pierwsze, dok_matrices nie obsługują tego - ale myślę, że działa (powoli), jeśli pierwszy rzut na lil_matrices, viasparse.lil_matrix(M)
O ile mogę zebrać z samouczka - do wycinania kolumn chcę użyć CSC i wyciąć wiersze, które chcę podzielić na CSR. Czy to oznacza, że powinienem rzucić matrycęM
przez:
M.tocsc()[:,bool_vect]
lub
M.tocsr()[bool_vect,:]
Zgaduję tutaj, a mój kod jest powolny z tego powodu. Wszelka pomoc od kogoś, kto rozumie, jak docenią to prace. Z góry dziękuję.
Jeśli okaże się, że nie powinienem indeksować mojej macierzy tablicą boolowską, a raczej listą liczb całkowitych (indeksów) - to też jest coś, co chętnie się dowiem. Którykolwiek jest bardziej wydajny.
Wreszcie - jest to duża matryca, więc punkty bonusowe, jeśli mogą się zdarzyć na miejscu / z transmisją.