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格式似乎既不支持花哨的索引,也不支持将值设置为切片.
我猜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_zeros
和prune
,但应该是很多的麻烦,以及(因为你不会用C做)可能会更慢.
有关eliminiate_zeros(和修剪)的详细信息
稀疏矩阵通常不会保存零元素,而只是存储非零元素的位置(粗略地和使用各种方法).eliminate_zeros
移除全零从稀疏图案的矩阵(即,没有存储用于该位置值,以前有当被存储在vlaue,但它是0).如果你想稍后将0更改为不同的值,则消除错误,否则节省空间.
修剪它会缩小存储的数据数组,当它们超过必要时.请注意,虽然我第一次A.prune()
在那里,A.eliminiate_zeros()
已经包括修剪.