我想了解为什么稀疏矩阵和密集向量的点积的时间增加:csr
最快,然后是csc
,coo
,lil
和{{ 1}}(最慢)。换句话说,我用不同的dok
来衡量这个程序的时间:
fmt
我想找到dot的功能scipy的源代码。 A = scipy.sparse.random(1000, 1000, format=fmt)
b = np.random.randn(1000, 1)
res = %timeit -o A * b
,csr
和coo
(csr_matvec,coo_matvec和csc_matvec很容易 - 它应该是第三个链接,如果我有10个reputaion =) )。但是我找不到csc
和lil
这样的功能。有人能回答我怎么找到它吗?
答案 0 :(得分:3)
// the `C&&` from the move will bind to the `const C&` of the operator=
auto anotherC = std::move(aC);
In [298]: M=sparse.coo_matrix(np.eye(3))
格式的产品首先转换为lil
:
csr
In [299]: Ml=M.tolil()
In [300]: Ml._mul_vector??
Signature: Ml._mul_vector(other)
Source:
def _mul_vector(self, other):
return self.tocsr()._mul_vector(other)
File: /usr/lib/python3/dist-packages/scipy/sparse/base.py
Type: method
是自己做的。 dok
是dok
的子类。
dict
但是为了与另一个稀疏矩阵相乘,它会进行In [303]: Md=M.todok()
In [304]: Md._mul_vector??
Signature: Md._mul_vector(other)
Source:
def _mul_vector(self, other):
# matrix * vector
result = np.zeros(self.shape[0], dtype=upcast(self.dtype,other.dtype))
for (i,j),v in iteritems(self):
result[i] += v * other[j]
return result
File: /usr/lib/python3/dist-packages/scipy/sparse/dok.py
转换。
csr
请注意,最后一个代码位于In [305]: Md._mul_sparse_matrix??
Signature: Md._mul_sparse_matrix(other)
Source:
def _mul_sparse_matrix(self, other):
return self.tocsr()._mul_sparse_matrix(other)
File: /usr/lib/python3/dist-packages/scipy/sparse/base.py
。这是通用稀疏代码所在的位置。如果格式没有定义自己的方法,则使用基本版本。
base.py
In [306]: Md.__class__.__mro__
Out[306]:
(scipy.sparse.dok.dok_matrix,
scipy.sparse.base.spmatrix,
scipy.sparse.sputils.IndexMixin,
dict,
object)
也会将coo
转换为完整的矩阵产品。