una que por organizar ordenar multiplicacion matriz matrices hacer filas como columnas array python indexing scipy sparse-matrix slice

que - organizar matriz en python



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

Ok, entonces estoy bastante seguro de que la forma "correcta" de hacer esto es: si estás cortando columnas, usa tocsc () y corta usando una lista / matriz de enteros. Los vectores booleanos no parecen hacer el truco con matrices dispersas, como lo hace con ndarrays en numpy. 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 el lugar, y es mucho más rápido que los intentos anteriores (usando lil_matrix).

El tutorial SciPy Sparse Matrix es muy bueno, pero en realidad deja la sección de slicing un (der) desarrollado (aún en forma de esquema - ver 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 cortar columnas y para otros, quiero cortar filas. Lo ideal sería usar indexación avanzada (es decir, un vector booleano, bool_vect ) con el que cortar una matriz dispersa M , 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 lo lanzo a lil_matrices, a través de sparse.lil_matrix(M)

Por lo que puedo deducir del tutorial: para dividir las columnas, quiero usar CSC y para cortar filas, quiero dividir la CSR. Entonces eso significa que debería lanzar la matriz M través de:

M.tocsc()[:,bool_vect]

o

M.tocsr()[bool_vect,:]

Estoy 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 gustaría saber. Cualquiera que sea más eficiente.

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