Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除/设置scipy中稀疏矩阵的非零对角元素_Python_Scipy_Sparse Matrix_Diagonal - Fatal编程技术网

Python 删除/设置scipy中稀疏矩阵的非零对角元素

Python 删除/设置scipy中稀疏矩阵的非零对角元素,python,scipy,sparse-matrix,diagonal,Python,Scipy,Sparse Matrix,Diagonal,假设我想从scipy.sparse.csr\u矩阵中删除对角线。有没有一种有效的方法?我看到在sparsetools模块中有C函数返回对角线 根据其他SO答案和我目前的方法如下: def csr\u setdiag\u val(csr,值=0): “”“设置所有对角非零元素 (当前处于稀疏模式的元素) 设置为给定值。设置为0非常有用。 """ 如果csr.format!=“企业社会责任”: raise VALUERROR('给定的矩阵必须为CSR格式') csr.sort_索引() 指针=csr

假设我想从
scipy.sparse.csr\u矩阵中删除对角线。有没有一种有效的方法?我看到在
sparsetools
模块中有
C
函数返回对角线

根据其他SO答案和我目前的方法如下:

def csr\u setdiag\u val(csr,值=0):
“”“设置所有对角非零元素
(当前处于稀疏模式的元素)
设置为给定值。设置为0非常有用。
"""
如果csr.format!=“企业社会责任”:
raise VALUERROR('给定的矩阵必须为CSR格式')
csr.sort_索引()
指针=csr.indptr
指数=企业社会责任指数
data=csr.data
对于范围内的i(最小(csr.shape)):
ind=索引[指针[i]:指针[i+1]]
j=ind.searchsorted(i)
#矩阵只有对角线之前的元素(第一行)
如果j==len(ind):
持续
j+=指针[i]
#如果矩阵只有对角线后的元素(第一行)
如果指数[j]==i:
数据[j]=值
然后我接着说

csr.消除零()

这是我不写自己的
Cython
code能做的最好的了吗?

基于@hpaulj的评论,我创建了一个IPython笔记本,它可以。这表明,在所有提到的方法中,以下方法最快(假设
mat
是稀疏CSR矩阵):

mat-scipy.sparse.dia_矩阵((mat.diagonal()[scipy.newaxis,:],[0]),形状=(一维,一维))

scr\u矩阵。setdiag
不够?
setdiag
接受一个数组,并设置以前不在矩阵中的元素。因此,向矩阵中添加新元素的成本很高,但我没有对它们进行比较。创建一个具有要删除的对角线的新稀疏矩阵,然后减去它怎么样?您可能需要运行“压缩”功能来完全删除条目。好主意!你可以。将上述功能简化可能会稍微提高速度,但减法目前最简单。