【发布时间】:2018-02-17 02:53:21
【问题描述】:
我构建了以下案例来测试一维稀疏矩阵乘法与 numpy 数组。
from scipy.sparse import csc_matrix
sp = csc_matrix((1, 36710))
sp[0,4162] = 0.2335
sp[0,21274] = 0.1367
sp[0,27322] = 0.261
sp[0,27451] = 0.9266
%timeit sp.dot(sp.T)
arr = sp.toarray()[0]
%timeit arr.dot(arr)
结果如下:
267 µs ± 6.58 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
9.9 µs ± 230 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
而且它们都比存储条目的普通 dict 和用于乘法的 for 循环 (~1µs) 慢。
尝试不同类型的稀疏矩阵(包括 csr/coo)后结果是一样的。为什么稀疏矩阵乘法比 numpy 密集数组乘法慢 30 倍?是不是因为矩阵太稀疏了?
【问题讨论】:
-
还有一个更快的解决方案:
sp.data.dot(sp.data),3.3ns per loop -
@NilsWerner 我可能需要稍微更改示例,但我需要将乘法应用于不同的矩阵,在这种情况下,您的解决方案会给出错误的答案
-
我想使用稀疏向量没有什么好处。如果您使用稀疏矩阵 (nxm, n,m>1),情况就会真正改变。
-
尝试稀疏度为 1% 和 10% 的矩阵。这种情况可能过于稀疏,因为稀疏矩阵设置主导了实际计算。
标签: numpy scipy sparse-matrix