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.