search

Home  >  Q&A  >  body text

稀疏矩阵的存储和计算的问题?

稀疏矩阵A:

            1     1    0     0
             0     0    1     0
             0     1    0     0
             1     0    0     1

   

如果用三元组表示B:

           1,1,1
            1,2,1
            2,3,1
            3,2,1
            4,1,1
            4,4,1

       

稀疏矩阵A中第一行和第三行进行与(&)运算,或对某一行进行否(~)运算。怎样映射到三元组中进行运算?

numpy和scipy中有没有相关的函数,可以构造稀疏矩阵,并进行行间的运算(& ~ |)?

谢谢


高洛峰高洛峰3064 days ago586

reply all(1)I'll reply

  • 三叔

    三叔2016-10-22 17:01:18

    稀疏矩阵, 行间的运算(& ~ |)这两个没问题

    python3

    >>> import numpy as np
    >>> #稀疏矩阵
    >>> A =[[1,1,0,0],
            [0,0,1,0],
            [0,1,0,0],
            [1,0,0,1]]
    >>> matA = np.array(A,dtype=np.bool)
    >>> matA[0]
    array([ True,  True, False, False], dtype=bool)
    >>> ~matA[0] # 非
    array([False, False,  True,  True], dtype=bool)
    >>> matA[1] | matA[3] # 或
    array([ True, False,  True,  True], dtype=bool)
    >>> matA[0] & matA[2] # 与
    array([False,  True, False, False], dtype=bool)
    >>>

    映射三元组 没问题

    >>> from scipy import sparse
    >>> coo_A = sparse.coo_matrix(A)
    >>> print(coo_A)
      (0, 0)    1
      (0, 1)    1
      (1, 2)    1
      (2, 1)    1
      (3, 0)    1
      (3, 3)    1
    >>> print(coo_A.todense())
    [[1 1 0 0]
     [0 0 1 0]
     [0 1 0 0]
     [1 0 0 1]]

    coo 是坐标的意思,构造方法如下:

    >>> from scipy import sparse
    >>> coor=( # 坐标:行,列,值
      (0, 0, 1),    
      (0, 1, 1),    
      (1, 2, 1),    
      (2, 1, 1),    
      (3, 0, 1),    
      (3, 3, 1)    
    )
    >>> *rc,data = zip(*coor)
    >>> rc # 坐标:行,列
    [(0, 0, 1, 2, 3, 3), (0, 1, 2, 1, 0, 3)]
    >>> spr_A = sparse.coo_matrix((data,rc),shape=(4,4)) # 4 x 4
    >>> print(spr_A.toarray())
    [[1 1 0 0]
     [0 0 1 0]
     [0 1 0 0]
     [1 0 0 1]]
    >>> r0 = spr_A.getrow(0).toarray() # 获取一行
    >>> r0
    array([[1, 1, 0, 0]], dtype=int32)
    >>>

    多数计算都必须用.toarray()转换为矩阵

    reply
    0
  • Cancelreply