Python 在scipy中创建稀疏矩阵时覆盖而不是添加重复的三元组

Python 在scipy中创建稀疏矩阵时覆盖而不是添加重复的三元组,python,scipy,sparse-matrix,Python,Scipy,Sparse Matrix,在scipy中,要从三重格式数据(行、列和数据数组)创建稀疏矩阵,默认行为是对所有重复项的数据值求和。我是否可以将此行为改为覆盖(或不执行任何操作) 例如: import scipy.sparse as sparse rows = [0, 0] cols = [0, 0] data = [1, 1] S = sparse.coo_matrix((data, (rows, cols))) 这里,S.todense()等于matrix([[2]]),但我希望它是matrix([[1]]) 在书中

在scipy中,要从三重格式数据(行、列和数据数组)创建稀疏矩阵,默认行为是对所有重复项的数据值求和。我是否可以将此行为改为覆盖(或不执行任何操作)

例如:

import scipy.sparse as sparse

rows = [0, 0]
cols = [0, 0]
data = [1, 1]
S = sparse.coo_matrix((data, (rows, cols)))
这里,
S.todense()
等于
matrix([[2]])
,但我希望它是
matrix([[1]])

在书中,它是这样写的

默认情况下,转换为CSR或CSC格式时,复制(i,j) 条目将汇总在一起。这有助于提高效率 构造有限元矩阵等


从这个公式看来,除了默认值之外,可能还有其他选项。

我在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
本身:

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\u 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]])
[727]中的
:dok=sparse.dok_矩阵((S.shape),dtype=S.dtype)
在[728]中:dok.update(zip(zip(S.row,S.col,S.data))
In[729]:dok
出[729]:
In[730]:打印(dok)
(0, 0)    1
In[731]:S
出[731]:
在[732]中:dok.A
Out[732]:数组([[1]])
这是一个字典更新,因此最终值是最后一个重复项。我在别处发现,
dok.update
是向稀疏矩阵添加值的一种非常快速的方法


tocsr
本质上做总和<代码>收费使用
tocsr
;因此,这种
todok
方法可能是最简单的

如果只希望值为1:

S.sum_duplicates()
S.data[:]=1