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)