【问题标题】:Sparse × Sparse matrix product which computes only some its elements稀疏 × 稀疏矩阵乘积,仅计算其部分元素
【发布时间】:2018-04-17 12:28:00
【问题描述】:

假设A、B 和C 是任何格式的稀疏矩阵。而且我想知道如何仅针对C 中的非零元素有效地计算他们的点积。

等于

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

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

你能给我一些建议吗?内存无关紧要。

【问题讨论】:

  • 为什么不使用 numpy ?
  • @rak007 numpy 密集矩阵乘法太贵了

标签: python matrix sparse-matrix linear-algebra


【解决方案1】:

您可以将C 转换为布尔值,并利用True 在乘法上下文中将变为1 的事实。然后,您可以在 A.dot(B) 和 C 的乘积之间进行元素乘法。

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

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

更快的点积

为了获得尽可能快的点积,我将对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)

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

【讨论】:

  • 这听起来是个不错的解决方案,谢谢!但如果有一种方法可以比A.dot(B) 更快地执行此操作,那就太好了。
  • 我在答案中添加了优化点积计算的想法。
猜你喜欢
  • 2017-07-20
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 2017-04-16
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多