Matrix multiplication for sparse matrices in Python

后端 未结 1 1014
鱼传尺愫
鱼传尺愫 2020-12-15 14:49

I want to multiply a sparse matrix A, with a matrix B which has 0, -1, or 1 as elements. To reduce the complexity of the matrix multiplication, I can ignore items if they ar

相关标签:
1条回答
  • 2020-12-15 15:13

    Have you looked at scipy.sparse? There's no point in re-inventing the wheel, here. Sparse matricies are a fairly standard thing.

    (In the example, I'm using a 300000x4 matrix for easier printing after the multiplication. A 300000x1000 matrix shouldn't be any problem, though. This will be much faster than multiplying two dense arrays, assuming you have a majority of 0 elements.)

    import scipy.sparse
    import numpy as np
    
    # Make the result reproducible...
    np.random.seed(1977)
    
    def generate_random_sparse_array(nrows, ncols, numdense):
        """Generate a random sparse array with -1 or 1 in the non-zero portions"""
        i = np.random.randint(0, nrows-1, numdense)
        j = np.random.randint(0, ncols-1, numdense)
        data = np.random.random(numdense)
        data[data <= 0.5] = -1
        data[data > 0.5] = 1
        ij = np.vstack((i,j))
        return scipy.sparse.coo_matrix((data, ij), shape=(nrows, ncols))
    
    A = generate_random_sparse_array(4, 300000, 1000)
    B = generate_random_sparse_array(300000, 5, 1000)
    
    C = A * B
    
    print C.todense()
    

    This yields:

    [[ 0.  1.  0.  0.  0.]
     [ 0.  2. -1.  0.  0.]
     [ 1. -1.  0.  0.  0.]
     [ 0.  0.  0.  0.  0.]]
    
    0 讨论(0)
提交回复
热议问题