稀疏矩阵:

  • 零元素的个数远远多于非零元素

  • 反义词:稠密矩阵

Scipy:

  • 创建稀疏矩阵的工具
  • 将稠密矩阵转化为稀疏矩阵的工具
  • 可以在Scipy上运行的函数:
    • 许多在Numpy数组上运行的线性代数Numpy和SciPy函数
    • Numpy数据结构的机器学习库,如:机器学习的scikit-learning和用于深度学习的Keras

Scipy中有可以表示的7种稀疏矩阵类型:

  1. csc_matrix: Compressed Sparse Column format(压缩稀疏列)
  2. csr_matrix: Compressed Sparse Row format(压缩稀疏行)
  3. bsr_matrix: Block Sparse Row format(块稀疏行)
  4. lil_matrix: List of Lists format(列表的列表)
  5. dok_matrix: Dictionary of Keys format(字典键值)
  6. coo_matrix: COOrdinate format (aka IJV, triplet format)()(坐标)
  7. 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----稀疏矩阵相关推荐

  1. 【Python稀疏矩阵】

    Python稀疏矩阵 1. 导入模块 2. SciPy中的稀疏矩阵 2.1 坐标列表格式 COO 2.2 格式转换 2.3 压缩列格式和压缩行格式 CSR/CSC 3. 创建稀疏矩阵 3.1 稀疏矩阵 ...

  2. python稀疏矩阵的存储与表示

    参考链接: https://blog.csdn.net/bitcarmanlee/article/details/52668477 https://blog.csdn.net/wangjian1204 ...

  3. Python稀疏矩阵(coo,csr)

    csr 或者coo .todense()返回矩阵 # data为csr matrix 或者是 coo matrix >>> print(data)(0, 0) -1.0(0, 1) ...

  4. 洪嘉振 计算多体系统动力学pdf_多体动力学演化python入门——quantum many-body scars 和稀疏矩阵后续...

    好久没更新了,肚子里也没什么货,就算python稀疏矩阵的最后一篇吧.之前的 路飞的哥哥:多体物理python入门--Ising模型和稀疏矩阵​zhuanlan.zhihu.com 计算了本征值,也就 ...

  5. 稀疏矩阵三元组 严蔚敏_Sparse稀疏矩阵主要存储格式总结

    在数据科学和深度学习等领域会采用矩阵来存储数据,但当矩阵较为庞大且非零元素较少时,运算效率和存储有效率并不高.所以,一般情况我们采用Sparse稀疏矩阵的方式来存储矩阵,来提高存储和运算效率.下面将对 ...

  6. Python使用scipy包将稀疏矩阵保存为Mtx格式和npz格式文件实战

    Python使用scipy包将稀疏矩阵保存为Mtx格式和npz格式文件实战 目录 Python将稀疏矩阵保存为Mtx格式和npz格式文件实战 #导入包和仿真数据

  7. 稀疏矩阵之python实现

          工程实践中,多数情况下,大矩阵一般都为稀疏矩阵,所以如何处理稀疏矩阵在实际中就非常重要. 1.sparse模块初探 python中scipy模块中,有一个模块叫sparse模块,就是专门为 ...

  8. python 的csr_python的高级数组之稀疏矩阵

    稀疏矩阵的定义: 具有少量非零项的矩阵(在矩阵中,若数值0的元素数目远多于非0元素的数目,并且非0元素分布没有规律时,)则称该矩阵为稀疏矩阵:相反,为稠密矩阵.非零元素的总数比上矩阵所有元素的总数为矩 ...

  9. 如何用三元组表表示下列稀疏矩阵_盘一盘 Python 系列特别篇21之:SciPy 稀疏矩阵...

    引言 和稠密矩阵相比,稀疏矩阵的最大好处就是节省大量的内存空间来储存零.稀疏矩阵本质上还是矩阵,只不过多数位置是空的,那么存储所有的 0 非常浪费.稀疏矩阵的存储机制有很多种 (列出常用的五种): C ...

  10. matlab产生一个稀疏向量,Matlab中的稀疏矩阵向量乘法比Python快吗?

    编辑:请参阅this question,在那里我学习了如何使用Numba在Python中并行化稀疏矩阵向量乘法,并能够与Matlab打交道.在 原题: 我发现在Matlab中稀疏矩阵向量乘法比Pyth ...

最新文章

  1. Microbiome:马铃薯疮痂病与土壤微生物组关系新进展
  2. ros udp协议53端口 封_每天一点IT-说说AD域的端口
  3. java 之 面向对象
  4. C++什么时候需要使用“常引用”?
  5. Mac Apache WebDav 服务器配置
  6. 关于label在ie8,9下的兼容问题???
  7. [前缀和][dp] Jzoj P5873 小p的属性
  8. 2016.7.27 VS搜索正则表达式,在UltraEdit中可选用Perl正则引擎,按C#语法搜索
  9. w ndows10怎么没体验指数,Win10没有“Windows体验指数”功能怎么进行系统评分【图文】...
  10. Java:判断某年是闰年or平年并输出某月的天数
  11. 人体表面积(BSA)计算器
  12. 每日一问 --什么是正弦信号?正弦信号有哪些特性?
  13. 12306打不开怎么办?
  14. macport 安装使用
  15. MNIST手写数字识别程序
  16. mysql的WAL技术是什么_我们常听到的WAL到底是什么
  17. 陶闯博士超级对话:互联网的终极进化——从物理世界到数实世界
  18. DL20 Gen9 server 安装 Raid
  19. 联想z470安装深度linux,联想 z470 成功安装 mac os EI Capitan 10.11.6
  20. 强大的IP地址定位库--ip2region 的初步使用

热门文章

  1. Codevs 1009 产生数
  2. 1131:Octal Fractions
  3. PTA 1027 Colors in Mars(读懂题目意思很重要!!)
  4. Kendo UI 刷新数据源信息
  5. ssh免密码登录配置方法,(图示加命令)
  6. 三分钟告诉你软件测试工程师到底是不是程序员?读完你就懂了!
  7. Camera AF和FF
  8. SAP_ABAP_BADI AND NEW BADI
  9. 神器必会!“世界上最好的编辑器Source Insight”
  10. 内部模块化的命令行菜单