代码之家  ›  专栏  ›  技术社区  ›  Ian McCartney

稀疏×稀疏矩阵积,仅计算其部分元素

  •  0
  • Ian McCartney  · 技术社区  · 6 年前

    认为 A ,则, B C 是任何格式的稀疏矩阵。我想知道如何只对中非零的元素有效地计算它们的点积 C

    等于

    prod = A.dot(B)
    prod[C == 0] = 0
    

    对于Python中的密集矩阵。但这段代码效率极低。

    你能给我一些建议吗?记忆并不重要。

    1 回复  |  直到 6 年前
        1
  •  0
  •   pilu    6 年前

    你可以投 C 使用布尔值并利用值 True 将成为 1 在乘法的上下文中。然后可以在 A.dot(B) C

    您可以通过以下方式实现:

    A.dot(B).to_csr().multiple(C.to_csr())
    

    更快的Dot产品

    为了获得尽可能快的点产品,我会对提供的所有稀疏格式进行强制搜索 scipy .定义计时功能,例如:

    from functools import wraps
    from time import time
    
    def timing(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            start = time()
            result = f(*args, **kwargs)
            end = time()
            print 'Elapsed time: {}'.format(end-start)
            return result
        return wrapper
    
    @timing
    def csr_dot(a, b):
        # Write similar functions for all other formats
        return a.to_csr().dot(b.to_csr())
    
    # This will print some time. Repeat for other formats.
    csr_dot(A, B)
    

    然后,您可以选择产生最佳时间的格式。