【发布时间】:2017-07-20 23:19:15
【问题描述】:
让我们将矩阵 A 视为对角矩阵,将矩阵 B 视为随机矩阵,两者的大小均为 N x N。 我们想利用矩阵 A 的稀疏特性来优化点积,即 dot(B,A)。
但是,如果我们使用矩阵 A 的稀疏性来计算乘积,我们看不到任何优势(而且速度要慢得多)。
import numpy as np
from scipy.sparse import csr_matrix
# Matrix sizes
N = 1000
#-- matrices generation --
A = np.zeros((N,N), dtype=complex)
for i in range(N):
A[i][i] = np.random.rand()
B = np.random.rand(N,N)
#product
%time csr_matrix(B).dot(A)
%time np.dot(B,A)
结果:
CPU 时间:用户 3.51 秒,系统:8 毫秒,总计:3.52 秒 挂起时间:3.74 秒
CPU 时间:用户 348 毫秒,系统:0 纳秒,总计:348 毫秒 挂墙时间:230 毫秒
如何正确做?
【问题讨论】:
-
%time csr_matrix(B).dot(A)首先将B转换为csr_matrix。你也想计时吗? -
但是 B 不是稀疏矩阵。 csr_matrix 应该只应用于稀疏矩阵。
-
我会说只有在矩阵非常大且非常稀疏时才使用稀疏矩阵方法。
np.dot在正常情况下效率极高。 -
可能我没有正确解释我的问题。我想利用 A 稀疏来做 np.dot(B,A)。
-
查看我的答案以获得更详细的解释。
标签: python numpy sparse-matrix