首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Csr_matrix.dot对Numpy.dot

Csr_matrix.dot对Numpy.dot
EN

Stack Overflow用户
提问于 2015-07-28 11:56:55
回答 1查看 1.8K关注 0票数 0

我有一个大的(n=50000)块对角csr_matrix,M,,表示一组图的邻接矩阵。我必须将M乘以稠密的numpy.array v多次。因此,我使用M.dot(v)

令人惊讶的是,我发现首先将M转换为numpy.array然后使用numpy.dot要快得多。

知道为什么会这样吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-28 13:51:46

我没有足够的内存在内存中容纳一个50000x50000稠密矩阵,并将它乘以一个50000向量。但是在这里可以找到一些低维的测试。

设置:

代码语言:javascript
复制
import numpy as np
from scipy.sparse import csr_matrix

def make_csr(n, N):
    rows = np.random.choice(N, n)
    cols = np.random.choice(N, n)
    data = np.ones(n)
    return csr_matrix((data, (rows, cols)), shape=(N,N), dtype=np.float32)

上面的代码在n矩阵中生成具有NxN非零元素的稀疏矩阵.

矩阵:

代码语言:javascript
复制
N = 5000

# Sparse matrices
A = make_csr(10*10, N)     # ~100 non-zero
B = make_csr(100*100, N)   # ~10000 non-zero
C = make_csr(1000*1000, N) # ~1000000 non-zero
D = make_csr(5000*5000, N) # ~25000000 non-zero
E = csr_matrix(np.random.randn(N,N), dtype=np.float32) # non-sparse

# Numpy dense arrays
An = A.todense()
Bn = B.todense()
Cn = C.todense()
Dn = D.todense()
En = E.todense()

b = np.random.randn(N)

计时:

代码语言:javascript
复制
>>> %timeit A.dot(b)       # 9.63 µs per loop
>>> %timeit An.dot(b)      # 41.6 ms per loop

>>> %timeit B.dot(b)       # 41.3 µs per loop
>>> %timeit Bn.dot(b)      # 41.2 ms per loop

>>> %timeit C.dot(b)       # 3.2 ms per loop
>>> %timeit Cn.dot(b)      # 41.2 ms per loop

>>> %timeit D.dot(b)       # 35.4 ms per loop
>>> %timeit Dn.dot(b)      # 43.2 ms per loop

>>> %timeit E.dot(b)       # 55.5 ms per loop
>>> %timeit En.dot(b)      # 43.4 ms per loop
  • 对于高度稀疏的矩阵(AB),它比1000x快一倍。
  • 对于不太稀疏的矩阵(C),它仍然得到10x加速比。
  • 对于几乎非稀疏矩阵(D由于索引中的重复而有一些0,但从概率上讲,它还是更快、不多、更快)。
  • 对于一个真正的非稀疏矩阵(E),操作比较慢,但不是很慢.

结论:得到的加速比取决于矩阵的稀疏性,但是对于N = 5000,稀疏矩阵总是更快的(只要它们有一些零项)。

由于内存问题,我无法对N = 50000进行尝试。您可以尝试上述代码,并使用该N查看您的感受。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31675610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档