Search code examples
pythonpython-3.xnumpyscipysparse-matrix

Add column to a sparse matrix


When I execute the following code I get a spares matrix:

import numpy as np
from scipy.sparse import csr_matrix

row = np.array([0, 0, 1, 2, 2, 2])
col = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
sp = csr_matrix((data, (row, col)), shape=(3, 3))
print(sp)

  (0, 0)        1
  (0, 2)        2
  (1, 2)        3
  (2, 0)        4
  (2, 1)        5
  (2, 2)        6

I want to add another column to this sparse matrix so the output is:

  (0, 0)        1
  (0, 2)        2
  (0, 3)        7
  (1, 2)        3
  (1, 3)        7
  (2, 0)        4
  (2, 1)        5
  (2, 2)        6
  (2, 3)        6

Basically I want to add another column that has the values 7,7,7.


Solution

  • The sparse.hstack used in @Paul Panzer's link is the simplest.

    In [760]: sparse.hstack((sp,np.array([7,7,7])[:,None])).A
    Out[760]: 
    array([[1, 0, 2, 7],
           [0, 0, 3, 7],
           [4, 5, 6, 7]], dtype=int32)
    

    sparse.hstack is not complicated; it just calls bmat([blocks]).

    sparse.bmat gets the coo attributes of all the blocks, joins them with the appropriate offself, and builds a new coo_matrix.

    In this case it joins

    In [771]: print(sp)
      (0, 0)    1
      (0, 2)    2
      (1, 2)    3
      (2, 0)    4
      (2, 1)    5
      (2, 2)    6
    In [772]: print(sparse.coo_matrix(np.array([7,7,7])[:,None]))
      (0, 0)    7
      (1, 0)    7
      (2, 0)    7
    

    while changing the column numbers of the last to 3.

    In [761]: print(sparse.hstack((sp,np.array([7,7,7])[:,None])))
      (0, 0)    1
      (0, 2)    2
      (1, 2)    3
      (2, 0)    4
      (2, 1)    5
      (2, 2)    6
      (0, 3)    7
      (1, 3)    7
      (2, 3)    7