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

查看:375
本文介绍了python - 稀疏矩阵的存储和计算的问题?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

谢谢

解决方案

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

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

这篇关于python - 稀疏矩阵的存储和计算的问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆