gpt4 book ai didi

row - scipy.sparse : Set row to zeros

转载 作者:行者123 更新时间:2023-12-04 08:12:33 27 4
gpt4 key购买 nike

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

下面的代码运行得很慢:

A = A.tolil()
A[indices, :] = 0
A = A.tocsr()

我不得不转换为 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()

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

原则上,您当然可以将 eliminate_zeros 短路。和 prune ,但这应该很麻烦,而且可能会更慢(因为你不会用 C 来做)。

有关消除零(和修剪)的详细信息

稀疏矩阵通常不保存零元素,而只是存储非零元素所在的位置(粗略地和各种方法)。 eliminate_zeros从稀疏模式中删除矩阵中的所有零(即没有为该位置存储值,之前存储了一个值,但它是 0)。如果您想稍后将 0 更改为不同的值,则消除是不好的,否则,它会节省空间。

Prune 只会缩小存储的数据数组,当它们比需要的时间长时。请注意,虽然我第一次拥有 A.prune()在那里, A.eliminiate_zeros()已经包括修剪。

关于row - scipy.sparse : Set row to zeros,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12129948/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com