我在 scipy github 上看到过关于对这个求和给予更多控制的讨论,但我不知道有任何生产变化。正如文档所示,对重复项求和有一个长期存在的传统。
创建时,coo
矩阵不求和;它只是将您的参数分配给它的属性:
In [697]: S = sparse.coo_matrix((data, (rows, cols)))
In [698]: S.data
Out[698]: array([1, 1])
In [699]: S.row
Out[699]: array([0, 0], dtype=int32)
In [700]: S.col
Out[700]: array([0, 0], dtype=int32)
转换为密集(或 csr/csc)确实求和 - 但不会改变S
itself:
In [701]: S.A
Out[701]: array([[2]])
In [702]: S.data
Out[702]: array([1, 1])
您可以使用以下命令就地执行求和:
In [703]: S.sum_duplicates()
In [704]: S.data
Out[704]: array([2], dtype=int32)
我不知道有什么方法可以删除重复项或绕过该操作。我可以查一下相关问题。
=================
S.todok()
进行就地求和(即改变S
)。查看该代码我发现它调用self.sum_duplicates
。以下复制了没有总和的情况:
In [727]: dok=sparse.dok_matrix((S.shape),dtype=S.dtype)
In [728]: dok.update(zip(zip(S.row,S.col),S.data))
In [729]: dok
Out[729]:
<1x1 sparse matrix of type '<class 'numpy.int32'>'
with 1 stored elements in Dictionary Of Keys format>
In [730]: print(dok)
(0, 0) 1
In [731]: S
Out[731]:
<1x1 sparse matrix of type '<class 'numpy.int32'>'
with 2 stored elements in COOrdinate format>
In [732]: dok.A
Out[732]: array([[1]])
这是字典更新,因此最终值是最后一个重复项。我在其他地方发现dok.update
是一种向稀疏矩阵添加值的快速方法。
tocsr
本质上就是求和;tolil
uses tocsr
;所以这todok
方法可能是最简单的。