沿轴 0 重复 scipy csr 稀疏矩阵

2024-05-15

我想重复 scipy csr 稀疏矩阵的行,但是当我尝试调用 numpy 的重复方法时,它只是将稀疏矩阵视为对象,并且只会将其作为 ndarray 中的对象重复。我浏览了文档,但找不到任何实用程序来重复 scipy csr 稀疏矩阵的行。

我编写了以下对内部数据进行操作的代码,这似乎有效

def csr_repeat(csr, repeats):
    if isinstance(repeats, int):
        repeats = np.repeat(repeats, csr.shape[0])
    repeats = np.asarray(repeats)
    rnnz = np.diff(csr.indptr)
    ndata = rnnz.dot(repeats)
    if ndata == 0:
        return sparse.csr_matrix((np.sum(repeats), csr.shape[1]),
                                 dtype=csr.dtype)
    indmap = np.ones(ndata, dtype=np.int)
    indmap[0] = 0
    rnnz_ = np.repeat(rnnz, repeats)
    indptr_ = rnnz_.cumsum()
    mask = indptr_ < ndata
    indmap -= np.int_(np.bincount(indptr_[mask],
                                  weights=rnnz_[mask],
                                  minlength=ndata))
    jumps = (rnnz * repeats).cumsum()
    mask = jumps < ndata
    indmap += np.int_(np.bincount(jumps[mask],
                                  weights=rnnz[mask],
                                  minlength=ndata))
    indmap = indmap.cumsum()
    return sparse.csr_matrix((csr.data[indmap],
                              csr.indices[indmap],
                              np.r_[0, indptr_]),
                             shape=(np.sum(repeats), csr.shape[1]))

并且相当高效,但我不想给班级打补丁。有一个更好的方法吗?

Edit

当我重新审视这个问题时,我想知道为什么我首先发布它。几乎所有我能想到的用重复矩阵做的事情都会更容易用原始矩阵来做,然后再应用重复。我的假设是,与任何潜在的答案相比,事后重复永远是解决这个问题的更好方法。


from scipy.sparse import csr_matrix
repeated_row_matrix = csr_matrix(np.ones([repeat_number,1])) * sparse_row
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

沿轴 0 重复 scipy csr 稀疏矩阵 的相关文章

随机推荐