¿Cómo acceder a elementos de matriz dispersos?

type(A)  A.shape (8529, 60877) print A[0,:] (0, 25) 1.0 (0, 7422) 1.0 (0, 26062) 1.0 (0, 31804) 1.0 (0, 41602) 1.0 (0, 43791) 1.0 print A[1,:] (0, 7044) 1.0 (0, 31418) 1.0 (0, 42341) 1.0 (0, 47125) 1.0 (0, 54376) 1.0 print A[:,0] #nothing returned 

Ahora, lo que no entiendo es cuando escribo A [1 ,:] que debería seleccionar elementos de la segunda fila, pero obtengo elementos de la primera fila en la impresión. Cuando escribo A [:, 0] eso debería devolver la primera columna pero no se imprime nada. ¿Por qué?

A[1,:] es en sí misma una matriz dispersa con forma (1, 60877). Esto es lo que está imprimiendo, y solo tiene una fila, por lo que todas las coordenadas de las filas son 0.

Por ejemplo:

 In [41]: a = csc_matrix([[1, 0, 0, 0], [0, 0, 10, 11], [0, 0, 0, 99]]) In [42]: a.todense() Out[42]: matrix([[ 1, 0, 0, 0], [ 0, 0, 10, 11], [ 0, 0, 0, 99]], dtype=int64) In [43]: print(a[1, :]) (0, 2) 10 (0, 3) 11 In [44]: print(a) (0, 0) 1 (1, 2) 10 (1, 3) 11 (2, 3) 99 In [45]: print(a[1, :].toarray()) [[ 0 0 10 11]] 

Puede seleccionar columnas, pero si no hay elementos distintos de cero en la columna, no se muestra nada cuando se imprime con print :

 In [46]: a[:, 3].toarray() Out[46]: array([[ 0], [11], [99]]) In [47]: print(a[:,3]) (1, 0) 11 (2, 0) 99 In [48]: a[:, 1].toarray() Out[48]: array([[0], [0], [0]]) In [49]: print(a[:, 1]) In [50]: 

La última llamada de print no muestra resultados porque la columna a[:, 1] no tiene elementos distintos de cero.

Para responder a la pregunta de su título utilizando una técnica diferente a los detalles de su pregunta:

csc_matrix te da el método .nonzero() .

Dado:

 >>> import numpy as np >>> from scipy.sparse.csc import csc_matrix >>> >>> row = np.array( [0, 1, 3]) >>> col = np.array( [0, 2, 3]) >>> data = np.array([1, 4, 16]) >>> A = csc_matrix((data, (row, col)), shape=(4, 4)) 

Puede acceder a los índices que se dirigen a datos distintos de cero mediante:

 >>> rows, cols = A.nonzero() >>> rows array([0, 1, 3], dtype=int32) >>> cols array([0, 2, 3], dtype=int32) 

Que luego puede utilizar para acceder a sus datos, sin tener que crear una versión densa de su matriz dispersa:

 >>> [((i, j), A[i,j]) for i, j in zip(*A.nonzero())] [((0, 0), 1), ((1, 2), 4), ((3, 3), 16)] 

Si es para calcular la puntuación TFIDF utilizando TfidfTransformer , puede obtener el IDF mediante tfidf.idf_ . Luego el nombre de la matriz dispersa, diga ‘a’, a.toarray().

toarray devuelve un ndarray; todense devuelve una matriz. Si quieres una matriz, usa todense ; de lo contrario, use toarray .

Reconozco completamente todas las otras respuestas dadas. Este es simplemente un enfoque diferente.

Para demostrar este ejemplo estoy creando una nueva matriz dispersa:

 from scipy.sparse.csc import csc_matrix a = csc_matrix([[1, 0, 0, 0], [0, 0, 10, 11], [0, 0, 0, 99]]) print(a) 

Salida:

 (0, 0) 1 (1, 2) 10 (1, 3) 11 (2, 3) 99 

Para acceder a esto fácilmente, como en la forma en que accedemos a una lista, la convertí en una lista.

 temp_list = [] for i in a: temp_list.append(list(iA[0])) print(temp_list) 

Salida:

 [[1, 0, 0, 0], [0, 0, 10, 11], [0, 0, 0, 99]] 

Esto puede parecer estúpido, ya que estoy creando una matriz dispersa y volviéndola a convertir, pero hay algunas funciones como TfidfVectorizer y otras que devuelven una matriz dispersa como salida y su manejo puede ser complicado. Esta es una forma de extraer datos de una matriz dispersa.