【问题标题】:Matrix multiplication for sparse matrices in PythonPython中稀疏矩阵的矩阵乘法
【发布时间】:2011-11-20 14:54:06
【问题描述】:

我想将稀疏矩阵 A 与具有 0、-1 或 1 元素的矩阵 B 相乘。为了降低矩阵乘法的复杂性,如果项目为 0,我可以忽略它们,或者如果项目为 1 或 subs,则继续添加不乘法的列。如果是-1。关于这个的讨论在这里:

Random projection algorithm pseudo code

现在我可以继续实现这个技巧,但我想知道如果我使用 Numpy 的乘法函数会更快。

有谁知道他们是否针对此类矩阵优化了矩阵乘法?或者你能建议一些东西来加快这个过程,因为我有一个 300000x1000 的矩阵。

【问题讨论】:

    标签: python multidimensional-array matrix numpy


    【解决方案1】:

    你看过scipy.sparse吗?在这里重新发明轮子是没有意义的。稀疏矩阵是相当标准的东西。

    (在示例中,我使用 300000x4 矩阵以便在乘法后打印。不过,300000x1000 矩阵应该没有问题。这将比将两个密集数组相乘快得多,假设你有大部分 0 元素。)

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

    这会产生:

    [[ 0.  1.  0.  0.  0.]
     [ 0.  2. -1.  0.  0.]
     [ 1. -1.  0.  0.  0.]
     [ 0.  0.  0.  0.  0.]]
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2017-07-20
    • 1970-01-01
    • 2021-01-31
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多