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