在scipy中删除/设置稀疏矩阵的非零对角线元素
问题描述:
说我想从scipy.sparse.csr_matrix
中删除对角线。有没有这样做的有效方式?我看到在sparsetools
模块中有C
函数返回对角线。在scipy中删除/设置稀疏矩阵的非零对角线元素
def csr_setdiag_val(csr, value=0):
"""Set all diagonal nonzero elements
(elements currently in the sparsity pattern)
to the given value. Useful to set to 0 mostly.
"""
if csr.format != "csr":
raise ValueError('Matrix given must be of CSR format.')
csr.sort_indices()
pointer = csr.indptr
indices = csr.indices
data = csr.data
for i in range(min(csr.shape)):
ind = indices[pointer[i]: pointer[i + 1]]
j = ind.searchsorted(i)
# matrix has only elements up until diagonal (in row i)
if j == len(ind):
continue
j += pointer[i]
# in case matrix has only elements after diagonal (in row i)
if indices[j] == i:
data[j] = value
然后我用
csr.eliminate_zeros()
遵循的是最好的,我可以做到不写我的拥有Cython
的代码?
答
根据@ hpaulj的评论,我创建了一个IPython Notebook can be seen on nbviewer。这说明了所有方法中提到以下是最快的(假设mat
是一个稀疏矩阵CSR):
mat - scipy.sparse.dia_matrix((mat.diagonal()[scipy.newaxis, :], [0]), shape=(one_dim, one_dim))
是'scr_matrix.setdiag'不够? –
'setdiag'接受一个数组,并设置先前不在矩阵中的元素。因此向矩阵中添加新元素的代价很高,但我没有对它们进行比较。 – Midnighter
如何创建一个新的稀疏矩阵与你想要删除的对角线,并减去它?您可能需要运行“压缩”功能才能完全删除条目。 – hpaulj