稀疏矩阵的存储和计算的问题?
高洛峰
高洛峰 2016-10-22 17:00:01
0
1
598

稀疏矩阵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中有没有相关的函数,可以构造稀疏矩阵,并进行行间的运算(& ~ |)?

谢谢


高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(1)
三叔

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

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()转换为矩阵

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan