频道栏目
首页 > 网络 > 云计算 > 正文

scipy.sparse中的csr删除行操作方法

2018-05-25 04:38:06         来源:mantoureganmian的专栏  
收藏   我要投稿

工作需要删除稀疏矩阵的某几行或者列,Google了一下,关于此的信息比较少,官方文档中没有找到相关函数,猜测应该是这个功能不常使用,所以官方没有加入。找到一个实现csr_matrix rows remove,但是他仅仅实现了删除一行。所以,自己动手丰衣足食。
建议不知道csr存储原理的,读一下csr的存储原理。

import scipy.sparse as sp
import numpy as np


def del_rows_from_csr_mtx(csr_mtx, row_indices):
    """ 从csr稀疏矩阵中,删除某几行
    思路:
        1. 在data中删除这些行的元素,在indices中删除这些元素的列标。
        2. 在indptr中删除行,同时要修正其余行所对应元素的在data和indices中的位置。
    :param csr_mtx: 原始csr稀疏矩阵
    :param row_indices: 要删除的行,array of int
    :return : 一个新的删除过行的csr矩阵
    """
    if isinstance(csr_mtx, sp.csc_matrix):
        csr_mtx = sp.csr_matrix(csr_mtx)

    indptr = csr_mtx.indptr
    indices = csr_mtx.indices
    data = csr_mtx.data
    m, n = csr_mtx.shape

    # 确认,要删除的元素的在data和indices中的位置
    target_row_ele_indices = [i for idx in row_indices for i in xrange(indptr[idx], indptr[idx+1])]
    # 删除元素和下标
    new_indices = np.delete(indices, target_row_ele_indices)
    new_data = np.delete(data, target_row_ele_indices)

    # 获得因为删除元素所造成的元素位置漂移的偏置量
    off_vec = np.zeros((m+1,), dtype=np.int)
    for idx in row_indices:
        off_vec[idx+1:] = off_vec[idx+1:] + (indptr[idx+1] - indptr[idx])
    # 修正位置
    new_indptr = indptr - off_vec
    # 删除掉这些行
    new_indptr = np.delete(new_indptr, row_indices)

    return sp.csr_matrix((new_data, new_indices, new_indptr), shape=(m-len(row_indices), n))

注意在返回时,新生成的矩阵一定要带上shape,不然会出错。

上一篇:Hadoop服务器下Sqoop安装教程
下一篇:GHBladed结果文件格式解析
相关文章
图文推荐
热门新闻

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站