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

发布于 2022-09-04 00:47:09 字数 474 浏览 16 评论 0

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

谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

许仙没带伞 2022-09-11 00:47:09

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

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]]

请教两个问题:1、三元组coo_A是什么类型?如果人工构造,该怎么写?2、进行行间运算,必须要todense()吗?不能直接利用三元组进行计算?

@haixia9060

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文