Python creates empty sparse matrix

I am trying to parse some real data into an object .mat

that will be loaded into my matlab script.

I am getting this error:

TypeError: object 'coo_matrix' does not support element assignment

I found coo_matrix . However, I cannot assign values ​​to it.

data.txt

10 45
11 12 
4 1

      

I would like to get a 100x100 sparse matrix . And assign 1 to

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

      


CODE

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')  

      

Any suggestions please?

+3


source to share


2 answers


Plotting this matrix using coo_matrix

using the parameters format (data, (rows, cols)):

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 '<class 'numpy.int32'>'
    with 3 stored elements in COOrdinate format>
In [11]: print(M)
  (10, 45)  1
  (11, 12)  1
  (4, 1)    1

      

If you save it in a .mat file for use in MATLAB, it will save it in the format csc

(convert it from 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 '<class 'numpy.int32'>'
    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

the format does not implement the element's purpose. csr

and csc

do it, but they will complain. But they are normal formats for calculation. lil

and dok

are the best formats for iterative assignment.

+2


source


Use a sparse format that supports efficient indexing like dok_matrix

It is an efficient framework for building sparse matrices incrementally.

...

Allows efficient O (1) access to individual elements. Duplicates are not allowed. Can be efficiently converted to a constructed coo_matrix.



The last sentence can be generalized to: can be effectively converted to all other common formats if needed.

from scipy.sparse import dok_matrix

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

      

+4


source







All Articles