• Scipy中的稀疏矩阵的编码方式


    import numpy as np
    from scipy import sparse
    

    (1)COO( Coordinate)

    最直观的就是COO格式。它用了1维的数组来表示2维的矩阵,每个数组的长度与稀疏矩阵A的非零数字个数一样,它们的组合(i,j)组成了非零数字在稀疏矩阵中的坐标。

    • row,col数组,组合起来指明非零数字在稀疏矩阵中的坐标/定位。
    • data数组,指定了非零数字是哪些
    s=np.array([[4,0,3],
               [0,32,0]]);s
    
    array([[ 4,  0,  3],
           [ 0, 32,  0]])
    

    为表示 s,我们这样做:

    data=np.array([4,3,32])
    
    row=np.array([0,0,1])
    
    col=np.array([0,2,1])
    
    s_coo=scipy.sparse.coo_matrix((data,(row,col)))
    

    .toarray()方法返回一个numpy数组来表示稀疏矩阵,我们用这个方法来检查下s_coo是否创建对了:

    s_coo.toarray()
    
    array([[ 4,  0,  3],
           [ 0, 32,  0]])
    

    同样我们可以用.A属性,但实际是调用了一个方法。但推荐用toarray()

    (2)CSR 格式(Compressed Sparse Row)

    COO格式虽然直观,但是不够精简,毕竟对于同一行/同一列的非零数字,我们重复的多用了row/column。因此,我们可以“压缩”行数,即只要表示出列数是从哪行到哪行就可以定位出非零数字的位置,而不用重复的写出来每一个非零数字的行数。这就是CSR的意思。

    首先看一个COO的例子:

    row=[0,1,1,1,1,2,3,4,4]
    
    col=[2,0,1,3,4,1,0,3,4]
    
    data=np.array([6,1,2,4,5,1,9,6,7])
    
    ss=sparse.coo_matrix((data,(row,col)))
    
    ss.toarray()
    
    array([[0, 0, 6, 0, 0],
           [1, 2, 0, 4, 5],
           [0, 1, 0, 0, 0],
           [9, 0, 0, 0, 0],
           [0, 0, 0, 6, 7]])
    

    现在用CRS格式,row换成indptr,indptr=[0,1,5,6,7,9],即表示col[0,1)在第一行,即6在第一行第2列;col[1,5)在第二行,即1,2,4,5在第二行的第0,1,3,4列,等等

    indptr=[0,1,5,6,7,9]
    
    csr=sparse.csr_matrix((data,col,indptr))
    
    csr.toarray()
    
    array([[0, 0, 6, 0, 0],
           [1, 2, 0, 4, 5],
           [0, 1, 0, 0, 0],
           [9, 0, 0, 0, 0],
           [0, 0, 0, 6, 7]])
    

    (3)CSC(Compressed Sparse Column)

    与CSR类似,但压缩的是列,data中的数字按列排列,不再赘述。

    ##### 愿你一寸一寸地攻城略地,一点一点地焕然一新 #####
  • 相关阅读:
    Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]
    Bitwise And Queries
    XD
    补题0%……计划进行中
    PC网页版、移动客户端、Wap版 有什么不同
    关于"软件评测师"
    POSTMAN-REST Client
    【NO.13】Jmeter
    【NO.12-1】Jmeter
    【NO.11】Jmeter
  • 原文地址:https://www.cnblogs.com/johnyang/p/14528002.html
Copyright © 2020-2023  润新知