scipy.sparse:将行设置为零

Ash*_*ath 8 row scipy sparse-matrix

假设我有一个CSR格式的矩阵,将行(或行)设置为零的最有效方法是什么?

以下代码运行缓慢:

A = A.tolil()
A[indices, :] = 0
A = A.tocsr()
Run Code Online (Sandbox Code Playgroud)

我不得不转换为scipy.sparse.lil_matrix因为CSR格式似乎既不支持花哨的索引,也不支持将值设置为切片.

seb*_*erg 6

我猜scipy只是没有实现它,但CSR格式会很好地支持这一点,请阅读维基百科关于"稀疏矩阵"的文章,关于什么indptr等等:

# A.indptr is an array, one for each row (+1 for the nnz):

def csr_row_set_nz_to_val(csr, row, value=0):
    """Set all nonzero elements (elements currently in the sparsity pattern)
    to the given value. Useful to set to 0 mostly.
    """
    if not isinstance(csr, scipy.sparse.csr_matrix):
        raise ValueError('Matrix given must be of CSR format.')
    csr.data[csr.indptr[row]:csr.indptr[row+1]] = value

# Now you can just do:
for row in indices:
    csr_row_set_nz_to_val(A, row, 0)

# And to remove zeros from the sparsity pattern:
A.eliminate_zeros()
Run Code Online (Sandbox Code Playgroud)

当然,这eliminate_zeros将从稀疏模式中删除从另一个地方设置的0 .如果你想这样做(在这一点上)取决于你在做什么,即.消除可能有意义延迟,直到可能添加新零的所有其他计算也完成,或者在某些情况下,您可能有0个值,您想稍后再次更改,因此消除它们将是非常糟糕的!

你可以在过程中短路的原则eliminate_zerosprune,但应该是很多的麻烦,以及(因为你不会用C做)可能会更慢.


有关eliminiate_zeros(和修剪)的详细信息

稀疏矩阵通常不会保存零元素,而只是存储非零元素的位置(粗略地和使用各种方法).eliminate_zeros移除全零从稀疏图案的矩阵(即,没有存储用于该位置值,以前有当存储在vlaue,但它是0).如果你想稍后将0更改为不同的值,则消除错误,否则节省空间.

修剪它会缩小存储的数据数组,当它们超过必要时.请注意,虽然我第一次A.prune()在那里,A.eliminiate_zeros()已经包括修剪.