沿轴0重复一个scipy csr稀疏矩阵

Eri*_*rik 5 python matrix repeat scipy sparse-matrix

我想重复scipy csr稀疏矩阵的行,但是当我尝试调用numpy的repeat方法时,它只是将稀疏矩阵视为一个对象,并且只会将其重复为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]))
Run Code Online (Sandbox Code Playgroud)

而且效率相当高,但我宁愿不修补这个班级.有一个更好的方法吗?

编辑

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

小智 5

from scipy.sparse import csr_matrix
repeated_row_matrix = csr_matrix(np.ones([repeat_number,1])) * sparse_row
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,如果答案包括对代码意图做什么的解释,以及为什么在不引入其他人的情况下解决问题,答案会更有帮助。感谢您提高答案的参考价值并使其更易于理解! (3认同)