您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 将符合特定条件的scipy.sparse矩阵行设置为零

5b51 2022/1/14 8:20:38 python 字数 2804 阅读 467 来源 www.jb51.cc/python

我想知道用稀疏矩阵替换不满足某个条件的行的最佳方法是什么.例如(我使用普通数组进行说明):我想用一行零替换总和大于10的每一行a = np.array([[0,0,0,1,1], [1,2,0,0,0], [6,7,4,1,0], # sum > 10 [0,1,1,

概述

我想知道用稀疏矩阵替换不满足某个条件的行的最佳方法是什么.例如(我使用普通数组进行说明):

我想用一行零替换总和大于10的每一行

a = np.array([[0,1,1],[1,2,0],[6,7,4,# sum > 10
              [0,[7,3,8],# sum > 10 
              [0,2]])

我想用零替换[2]和[4],所以我的输出应该如下所示:

array([[0,[0,2]])

这对于密集矩阵来说非常简单:

row_sum = a.sum(axis=1)
to_keep = row_sum >= 10   
a[to_keep] = np.zeros(a.shape[1]) 

但是,当我尝试:

s = sparse.csr_matrix(a) 
s[to_keep,:] = np.zeros(a.shape[1])

我收到此错误

    raise NotImplementedError("Fancy indexing in assignment not "
NotImplementedError: Fancy indexing in assignment not supported for csr matrices.

因此,我需要一个不同的稀疏矩阵解决方案.我想出了这个:

def zero_out_unfit_rows(s_mat,limit_row_sum):
    row_sum = s_mat.sum(axis=1).T.A[0]
    to_keep = row_sum <= limit_row_sum
    to_keep = to_keep.astype('int8')
    temp_diag = get_sparse_diag_mat(to_keep)
    return temp_diag * s_mat

def get_sparse_diag_mat(my_diag):
    N = len(my_diag)
    my_diags = my_diag[np.newaxis,:]
    return sparse.dia_matrix((my_diags,[0]),shape=(N,N))

这依赖于以下事实:如果我们将单位矩阵中对角线的第2和第4个元素设置为零,则将预乘矩阵的行设置为零.

但是,我觉得有更好的,更多的scipynic解决方案.有更好的解决方案吗?

a = np.array([[0,2]])
sps_a = sps.csr_matrix(a)

# get sum of each row:
row_sum = np.add.reduceat(sps_a.data,sps_a.indptr[:-1])

# set values to zero
row_mask = row_sum > 10
nnz_per_row = np.diff(sps_a.indptr)
sps_a.data[np.repeat(row_mask,nnz_per_row)] = 0
# ask scipy.sparse to remove the zeroed entries
sps_a.eliminate_zeros()

>>> sps_a.toarray()
array([[0,2]])
>>> sps_a.nnz # it does remove the entries,not simply set them to zero
10

总结

以上是编程之家为你收集整理的python – 将符合特定条件的scipy.sparse矩阵行设置为零全部内容,希望文章能够帮你解决python – 将符合特定条件的scipy.sparse矩阵行设置为零所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶