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

El tutorial de SciPy Sparse Matrix es muy bueno, pero en realidad deja la sección sobre el corte de un (der) desarrollado (aún en forma de esquema, consulte 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 M dispersa, 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 lo primero que hago es lil_matrices, a través de sparse.lil_matrix(M)

    En la medida en que puedo recostackrlo del tutorial: para dividir columnas quiero usar CSC y para dividir filas quiero dividir CSR. Entonces, ¿eso significa que debo lanzar la matriz M través de:

     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.

    Bien, estoy bastante seguro de que la forma “correcta” de hacer esto es: si está cortando columnas, use tocsc () y corte utilizando una lista / matriz de enteros. Los vectores booleanos no parecen hacer el truco con matrices dispersas, como lo hace con los ndarrays en números. Lo que significa que la respuesta es.

     indices = np.where(bool_vect)[0] out1 = M.tocsc()[:,indices] out2 = M.tocsr()[indices,:] 

    Pero pregunta: ¿es esta la mejor manera? ¿Está esto en su lugar?

    En la práctica, esto parece estar sucediendo en su lugar, y es mucho más rápido que los bashs anteriores (utilizando lil_matrix).