m_ptr = csc_mat.indptr
sizes = m_ptr.take(v_rows + 1) - m_ptr.take(v_rows)
sizes = np.concatenate(([0], np.cumsum(sizes)))
data = np.empty((sizes[-1],), dtype=csc_mat.dtype)
indices = np.empty((sizes[-1],), dtype=np.intp)
indptr = np.zeros((2,), dtype=np.intp)
for j in range(len(sizes) - 1):
    slice_ = slice(*m_ptr[[v_rows[j], v_rows[j] + 1]])
np.multiply(m_dat[slice_], v_data[j], out=data[sizes[j]:sizes[j + 1]])
indices[sizes[j]:sizes[j + 1]] = m_ind[slice_]
indptr[-1] = len(data)
ret = sps.csc_matrix((data, indices, indptr), shape=csc_vec.shape)
ret.sum_duplicates()
return ret
Улучшение производительности умножения разреженных матриц Scipy