Python crea una matriz dispersa vacía

Estoy tratando de analizar algunos datos reales en un objeto .mat para cargar en mi script matlab .

Estoy recibiendo este error:

TypeError: el objeto ‘coo_matrix’ no admite la asignación de elementos

He encontrado coo_matrix . Sin embargo, no puedo asignarle valores.

data.txt

 10 45 11 12 4 1 

Me gustaría obtener una matriz dispersa de tamaño 100×100 . Y asignar 1 a

 Mat(10, 45) = 1 Mat(11, 12) = 1 Mat(4, 1) = 1 

CÓDIGO

 import numpy as np from scipy.sparse import coo_matrix def pdata(pathToFile): M = coo_matrix(100, 100) with open(pathToFile) as f: for line in f: s = line.split() x, y = [int(v) for v in s] M[x, y] = 1 return M if __name__ == "__main__": M = pdata('small.txt') 

¿Alguna sugerencia por favor?

Construyendo esta matriz con coo_matrix , usando el formato de parámetro (datos, (filas, columnas)) `

 In [2]: from scipy import sparse In [3]: from scipy import io In [4]: data=np.array([[10,45],[11,12],[4,1]]) In [5]: data Out[5]: array([[10, 45], [11, 12], [ 4, 1]]) In [6]: rows = data[:,0] In [7]: cols = data[:,1] In [8]: data = np.ones(rows.shape, dtype=int) In [9]: M = sparse.coo_matrix((data, (rows, cols)), shape=(100,100)) In [10]: M Out[10]: <100x100 sparse matrix of type '' with 3 stored elements in COOrdinate format> In [11]: print(M) (10, 45) 1 (11, 12) 1 (4, 1) 1 

Si lo guarda en un archivo .mat para usarlo en MATLAB, lo guardará en formato csc (habiéndolo convertido desde el coo ):

 In [13]: io.savemat('test.mat',{'M':M}) In [14]: d = io.loadmat('test.mat') In [15]: d Out[15]: {'M': <100x100 sparse matrix of type '' with 3 stored elements in Compressed Sparse Column format>, '__globals__': [], '__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Mon Aug 7 08:45:12 2017', '__version__': '1.0'} 

coo formato coo no implementa la asignación de elementos. csr y csc lo implementan, pero se quejarán. Pero son los formatos normales para el cálculo. lil y dok son los mejores formatos para la asignación iterativa.

Utilice un formato disperso, que admita una indexación eficiente, como dok_matrix

Esta es una estructura eficiente para construir matrices dispersas de manera incremental.

Permite el acceso eficiente a O (1) de elementos individuales. No se permiten duplicados. Se puede convertir de manera eficiente a coo_matrix una vez construido.

La última oración se puede generalizar a: se puede convertir de manera eficiente a todos los otros formatos comunes, si es necesario.

 from scipy.sparse import dok_matrix M = dok_matrix((100, 100)) # extra brackets needed as mentioned in comments # thanks Daniel! M[0,3] = 5