Python----稀疏矩阵
稀疏矩阵:
零元素的个数远远多于非零元素
反义词:稠密矩阵
Scipy:
- 创建稀疏矩阵的工具
- 将稠密矩阵转化为稀疏矩阵的工具
- 可以在Scipy上运行的函数:
- 许多在Numpy数组上运行的线性代数Numpy和SciPy函数
- Numpy数据结构的机器学习库,如:机器学习的scikit-learning和用于深度学习的Keras
Scipy中有可以表示的7种稀疏矩阵类型:
- csc_matrix: Compressed Sparse Column format(压缩稀疏列)
- csr_matrix: Compressed Sparse Row format(压缩稀疏行)
- bsr_matrix: Block Sparse Row format(块稀疏行)
- lil_matrix: List of Lists format(列表的列表)
- dok_matrix: Dictionary of Keys format(字典键值)
- coo_matrix: COOrdinate format (aka IJV, triplet format)()(坐标)
- dia_matrix: DIAgonal format()(对角)
coo_matrix(坐标):
最简单的存储方式:三个数组row、col和data保存非零元素的行下标,列下标与值
coo_matrix主要用来创建矩阵
coo_matrix无法对矩阵的元素进行增删改等操作
一旦创建之后,除了将之转换成其它格式的矩阵,几乎无法对其做任何操作和矩阵运算
优点:
转换成其它存储格式很快捷简便,转换成csr/csc很快
允许重复的索引(例如在1行1列处存了值2.0,又在1行1列处存了值3.0,则转换成其它矩阵时就是2.0+3.0=5.0)
缺点:
不支持切片和算术运算操作
>>> row = [0, 1, 2, 2]
>>> col = [0, 1, 2, 3]
>>> data = [1, 2, 3, 4]
# 生成coo格式的矩阵
>>> coo_mat = sparse.coo_matrix((data, (row, col)), shape=(4, 4))
>>> coo_mat
<4x4 sparse matrix of type '<class 'numpy.int32'>'with 4 stored elements in COOrdinate format>>>> coo_mat.toarray()
array([[1, 0, 0, 0],[0, 2, 0, 0],[0, 0, 3, 4],[0, 0, 0, 0]])
dok_matrix(和coo有点像, 只不过元祖是"键", data是"值"):
逐渐添加矩阵的元素
采用字典来记录矩阵中不为0的元素:
key: 记录元素的位置信息的元祖
value: 记录元素的具体值
- 优点:
- 递增的构建稀疏矩阵很高效
- 访问某个单元,只需要O(1)
- 缺点:
- 不允许重复索引(coo中适用),但可以很高效的转换成coo后进行重复索引
>>> S = sparse.dok_matrix((5, 5), dtype=np.float32)
>>> for i in range(5):for j in range(5):S[i,j] = i+j # 更新元素>>> S.toarray()
[[0. 1. 2. 3. 4.][1. 2. 3. 4. 5.][2. 3. 4. 5. 6.][3. 4. 5. 6. 7.][4. 5. 6. 7. 8.]]
lil_matrix(两列表: 一个每行中的非0元素, 一个每个元素对应列):
用两个列表存储非0元素。
data保存每行中的非零元素,rows保存非零元素所在的列。
适合逐个添加元素,并且能快速获取行相关的数据。
>>> l = sparse.lil_matrix((4, 4))
>>> l[1, 1] = 1
>>> l[1, 3] =2
>>> l[2, 3] = 3
>>> l.toarray()
array([[0., 0., 0., 0.],[0., 1., 0., 2.],[0., 0., 0., 3.],[0., 0., 0., 0.]])
- 优点:
- 适合递增的构建成矩阵
- 转换成其它存储方式很高效
- 支持灵活的切片
- 缺点:
- 当矩阵很大时,考虑用coo
- 算术操作,列切片,矩阵向量内积操作慢
csr_matrix:(列号, 数据, 第一个元素起始行+到该行结束有多少数据)
>>> data = np.array([1, 2, 3, 4, 5, 6]) #数据
>>> indices = np.array([0, 2, 2, 0, 1, 2]) #每个数据的列下标
>>> indptr = np.array([0, 2, 3, 6]) #0:起始的行号 2,3,6: 到该行累计有几个数>>> csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 2],[0, 0, 3],[4, 5, 6]])
csc_matrix:(列号, 数据, 第一个元素起始行+到该行结束有多少数据)
>>> data = np.array([1, 2, 3, 4, 5, 6]) #数据
>>> indices = np.array([0, 2, 2, 0, 1, 2]) #每个数据的行号
>>> indptr = np.array([0, 2, 3, 6]) #0:起始的列 2,3,6:到该列累计有多少数据>>> csc_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 4],[0, 0, 5],[2, 3, 6]])
参考博文(写得非常好):https://www.cnblogs.com/hellojamest/p/11769467.html
scipy.sparse.diags:从对角线构造稀疏矩阵:
scipy.sparse.diags(diagonals, offsets=0, shape=None, format=None, dtype=None)
- 参数:
- diagonals:用来构成对角线的数组序列
- offsets:对应的对角线
- 0:主对角线
- 1:主对角线上面的对角线
- -1:主对角线下面的对角线
- 2:主对角线上两个对角线
- 用已有的数组序列构造,并且标明分别属于哪个对角线
>>> from scipy.sparse import diags
>>> diagonals = [[1, 2, 3, 4], [1, 2, 3], [1, 2]]
>>> diags(diagonals, [0, -1, 2]).toarray()
array([[1, 0, 1, 0],[1, 2, 0, 2],[0, 2, 3, 0],[0, 0, 3, 4]])
>>> diags([1, 2, 3], 1).toarray()
array([[ 0., 1., 0., 0.],[ 0., 0., 2., 0.],[ 0., 0., 0., 3.],[ 0., 0., 0., 0.]])
- 用单个元素构造,并且表明分别属于哪个对角线和形状
>>> diags([1, -2, 1], [-1, 0, 1], shape=(4, 4)).toarray()
array([[-2., 1., 0., 0.],[ 1., -2., 1., 0.],[ 0., 1., -2., 1.],[ 0., 0., 1., -2.]])
参考博文:https://blog.csdn.net/lonelykid96/article/details/102733088
Python----稀疏矩阵相关推荐
- 【Python稀疏矩阵】
Python稀疏矩阵 1. 导入模块 2. SciPy中的稀疏矩阵 2.1 坐标列表格式 COO 2.2 格式转换 2.3 压缩列格式和压缩行格式 CSR/CSC 3. 创建稀疏矩阵 3.1 稀疏矩阵 ...
- python稀疏矩阵的存储与表示
参考链接: https://blog.csdn.net/bitcarmanlee/article/details/52668477 https://blog.csdn.net/wangjian1204 ...
- Python稀疏矩阵(coo,csr)
csr 或者coo .todense()返回矩阵 # data为csr matrix 或者是 coo matrix >>> print(data)(0, 0) -1.0(0, 1) ...
- 洪嘉振 计算多体系统动力学pdf_多体动力学演化python入门——quantum many-body scars 和稀疏矩阵后续...
好久没更新了,肚子里也没什么货,就算python稀疏矩阵的最后一篇吧.之前的 路飞的哥哥:多体物理python入门--Ising模型和稀疏矩阵zhuanlan.zhihu.com 计算了本征值,也就 ...
- 稀疏矩阵三元组 严蔚敏_Sparse稀疏矩阵主要存储格式总结
在数据科学和深度学习等领域会采用矩阵来存储数据,但当矩阵较为庞大且非零元素较少时,运算效率和存储有效率并不高.所以,一般情况我们采用Sparse稀疏矩阵的方式来存储矩阵,来提高存储和运算效率.下面将对 ...
- Python使用scipy包将稀疏矩阵保存为Mtx格式和npz格式文件实战
Python使用scipy包将稀疏矩阵保存为Mtx格式和npz格式文件实战 目录 Python将稀疏矩阵保存为Mtx格式和npz格式文件实战 #导入包和仿真数据
- 稀疏矩阵之python实现
工程实践中,多数情况下,大矩阵一般都为稀疏矩阵,所以如何处理稀疏矩阵在实际中就非常重要. 1.sparse模块初探 python中scipy模块中,有一个模块叫sparse模块,就是专门为 ...
- python 的csr_python的高级数组之稀疏矩阵
稀疏矩阵的定义: 具有少量非零项的矩阵(在矩阵中,若数值0的元素数目远多于非0元素的数目,并且非0元素分布没有规律时,)则称该矩阵为稀疏矩阵:相反,为稠密矩阵.非零元素的总数比上矩阵所有元素的总数为矩 ...
- 如何用三元组表表示下列稀疏矩阵_盘一盘 Python 系列特别篇21之:SciPy 稀疏矩阵...
引言 和稠密矩阵相比,稀疏矩阵的最大好处就是节省大量的内存空间来储存零.稀疏矩阵本质上还是矩阵,只不过多数位置是空的,那么存储所有的 0 非常浪费.稀疏矩阵的存储机制有很多种 (列出常用的五种): C ...
- matlab产生一个稀疏向量,Matlab中的稀疏矩阵向量乘法比Python快吗?
编辑:请参阅this question,在那里我学习了如何使用Numba在Python中并行化稀疏矩阵向量乘法,并能够与Matlab打交道.在 原题: 我发现在Matlab中稀疏矩阵向量乘法比Pyth ...
最新文章
- Microbiome:马铃薯疮痂病与土壤微生物组关系新进展
- ros udp协议53端口 封_每天一点IT-说说AD域的端口
- java 之 面向对象
- C++什么时候需要使用“常引用”?
- Mac Apache WebDav 服务器配置
- 关于label在ie8,9下的兼容问题???
- [前缀和][dp] Jzoj P5873 小p的属性
- 2016.7.27 VS搜索正则表达式,在UltraEdit中可选用Perl正则引擎,按C#语法搜索
- w ndows10怎么没体验指数,Win10没有“Windows体验指数”功能怎么进行系统评分【图文】...
- Java:判断某年是闰年or平年并输出某月的天数
- 人体表面积(BSA)计算器
- 每日一问 --什么是正弦信号?正弦信号有哪些特性?
- 12306打不开怎么办?
- macport 安装使用
- MNIST手写数字识别程序
- mysql的WAL技术是什么_我们常听到的WAL到底是什么
- 陶闯博士超级对话:互联网的终极进化——从物理世界到数实世界
- DL20 Gen9 server 安装 Raid
- 联想z470安装深度linux,联想 z470 成功安装 mac os EI Capitan 10.11.6
- 强大的IP地址定位库--ip2region 的初步使用