python - 稀疏矩阵的存储和计算的问题?
本文介绍了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()吗?不能直接利用三元组进行计算?
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屋!
查看全文