Cortar matrices dispersas en Scipy - ¿Qué tipos funcionan mejor?

La cienciaTutorial de matriz dispersa es muy bueno, pero en realidad deja la sección sobre el corte de un (der) desarrollado (aún en forma de esquema - vea la sección: "Manejo de matrices dispersas").

Intentaré actualizar el tutorial una vez que se responda esta pregunta.

Tengo una gran matriz dispersa, actualmente en formato dok_matrix.

import numpy as np
from scipy import sparse
M = sparse.dok_matrix((10**6, 10**6))

Para varios métodos quiero poder dividir columnas y para otros quiero dividir filas. Lo ideal sería utilizar la indexación avanzada (es decir, un vector booleano,bool_vect) con la que cortar una matriz dispersaM -- como en:

bool_vect = np.arange(10**6)%2  # every even index
out = M[bool_vect,:]            # Want to select every even row

o

out = M[:,bool_vect] # Want to select every even column

En primer lugar, dok_matrices no es compatible con esto, pero creo que funciona (lentamente) si primero lanzo a lil_matrices, a través desparse.lil_matrix(M)

En la medida en que puedo recopilarlo del tutorial: para dividir columnas quiero usar CSC y para dividir filas quiero dividir CSR. Entonces, ¿eso significa que debo lanzar la matriz?M vía:

M.tocsc()[:,bool_vect]

o

M.tocsr()[bool_vect,:]

Estoy un poco adivinando aquí y mi código es lento por eso. Cualquier ayuda de alguien que entienda cómo funciona esto sería apreciada. Gracias por adelantado.

Si resulta que no debería estar indexando mi matriz con una matriz booleana, sino más bien una lista de enteros (índices), eso también es algo que me encantaría descubrir. El que sea más eficiente.

Finalmente, esta es una gran matriz, por lo que los puntos de bonificación si esto puede suceder en el lugar / con la transmisión.

Respuestas a la pregunta(1)

Su respuesta a la pregunta