zoukankan      html  css  js  c++  java
  • python 稀疏向量和矩阵的表示形式

     

    http://blog.csdn.net/nkwangjie/article/details/17502443

    http://blog.csdn.net/bitcarmanlee/article/details/52668477

    稀疏矩阵有很多种,这里总结2种:

    from scipy import sparse

    1、csr_matrix  【行压缩矩阵)   (与之对应,列压缩举证:csc_matrix】

    csr_matrix,全名为Compressed Sparse Row,是按行对矩阵进行压缩的。CSR需要三类数据:数值,列号,以及行偏移量。

    CSR是一种编码的方式,其中,数值与列号的含义,与coo里是一致的。

    行偏移表示某一行的第一个元素在values里面的起始偏移位置。 
    同样在网络上找了一张图,能比较好反映其中的原理。 

    CSR是比较标准的一种,也需要三类数据来表达:数值,列号,以及行偏移。CSR不是三元组,而是整体的编码方式。

    数值列号与COO一致,表示一个元素以及其列号,行偏移表示某一行的第一个元素在values里面的起始偏移位置。

    如下图中,第一行元素1是0偏移,第二行元素2是2偏移,第三行元素5是4偏移,第4行元素6是7偏移。在行偏移的最后补上矩阵总的元素个数,本例中是9。

     【备注】  列索引表示数值所在的列号,从0开始。值表示该数值。没有行索引,行索引被压缩,而在COO中,行索引没被压缩。这里用行偏移表示行索引,

    其实就是把值作为一个列表后,指出值这个列表中哪个值是某一行的第一个元素。比如,下图有4行,那么行索引有4个,0,2,4,7 分别表示,在值得列表中,第

    0个,第2个,第4个,第7个分别为第1,2,3,4行的第一个元素,即值列表中的1,2,5,6。这样有几行数据,就只需要几个行偏移值了。

    最后一个9,表示非零元素一共有9个。

    这里写图片描述

    看看在python里怎么使用:

    >>> from scipy.sparse import csr_matrix
    >>> indptr = np.array([0, 2, 3, 6])
    >>> indices = np.array([0, 2, 2, 0, 1, 2])
    >>> data = np.array([1, 2, 3, 4, 5, 6])
    >>> csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()
    array([[1, 0, 2],
           [0, 0, 3],
           [4, 5, 6]])



    2.coo_matrix

    coo_matrix是最简单的存储方式。采用三个数组row、col和data保存非零元素的信息。这三个数组的长度相同,row保存元素的行,col保存元素的列,data保存元素的值。

    一般来说,coo_matrix主要用来创建矩阵,因为coo_matrix无法对矩阵的元素进行增删改等操作,一旦矩阵创建成功以后,会转化为其他形式的矩阵。

    >>> row = [2,2,3,2]
    >>> col = [3,4,2,3]
    >>> c = sparse.coo_matrix((data,(row,col)),shape=(5,6))
    >>> print c.toarray()
    [[0 0 0 0 0 0]
     [0 0 0 0 0 0]
     [0 0 0 5 2 0]
     [0 0 3 0 0 0]
     [0 0 0 0 0 0]]


  • 相关阅读:
    内存分布
    多态的作用
    c++虚函数实现与this指针
    Makefile 初探
    编译性语言和解释性语言
    从今天开始学好C++
    Java基础
    程序流程控制
    Java运算符
    初识Java
  • 原文地址:https://www.cnblogs.com/zhangbojiangfeng/p/5994579.html
Copyright © 2011-2022 走看看