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ą.

questionAnswers(1)

yourAnswerToTheQuestion