一、scipy.sparse中七种稀疏矩阵类型

1、bsr_matrix:分块压缩稀疏行格式

  • 介绍

  BSR矩阵中的inptr列表的第i个元素与i+1个元素是储存第i行的数据的列索引以及数据的区间索引,即indices[indptr[i]:indptr[i+1]]为第i行元素的列索引,data[indptr[i]: indptr[i+1]]为第i行元素的data。

  在下面的例子中,对于第0行,indptr[0]:indptr[1] -> 0:2,因此第0行的列为indice[0:2]=[0,2],data为data[0:2]=array([[[1, 1],[1, 1]],[[2, 2],[2, 2]]]),对应的就是最后结果的第0,1行。

  • 优点

  和压缩稀疏行格式(CSR)很相似,但是BSR更适合于有密集子矩阵的稀疏矩阵,分块矩阵通常出现在向量值有限的离散元中,在这种情景下,比CSR和CSC算术操作更有效。

  • 示例

  1. indptr = np.array([0, 2, 3, 6])
  2. indices = np.array([0, 2, 2, 0, 1, 2])
  3. data = np.array([1, 2, 3, 4, 5, 6]).repeat(4).reshape(6, 2, 2)
  4. bsr_mat=bsr_matrix((data,indices,indptr), shape=(6, 6)).toarray()
  5.  
  6. 输出:
  7. '''
  8. [[1 1 0 0 2 2]
  9. [1 1 0 0 2 2]
  10. [0 0 0 0 3 3]
  11. [0 0 0 0 3 3]
  12. [4 4 5 5 6 6]
  13. [4 4 5 5 6 6]]
  14. '''

2、coo_matrix是可以根据行和列索引进行data值的累加

  • 介绍

  坐标形式的一种稀疏矩阵。采用三个数组row、col和data保存非零元素的信息。这三个数组的长度相同,row保存元素的行,col保存元素的列,data保存元素的值。许多稀疏矩阵的数据都是采用这种格式保存在文件中的,例如某个CSV文件中可能有这样三列:“用户ID,商品ID,评价值”。采用numpy.loadtxt或pandas.read_csv将数据读入之后,可以通过coo_matrix快速将其转换成稀疏矩阵:矩阵的每行对应一位用户,每列对应一件商品,而元素值为用户对商品的评价。

  • 优点

  便利快捷的在不同稀疏格式间转换;允许重复录入,允许重复的元素;从CSR\CSC格式转换非常快速。

  • 缺点

  不能直接进行科学计算和切片操作;不支持元素的存取和增删,一旦创建之后,除了将之转换成其它格式的矩阵,几乎无法对其做任何操作和矩阵运算。

  1. row = np.array([0, 0, 1, 3, 1, 0, 0])
  2. col = np.array([0, 2, 1, 3, 1, 0, 0])
  3. data = np.array([1, 1, 1, 1, 1, 1, 1])
  4. coo_mat=coo_matrix((data, (row, col)), shape=(4, 4)).toarray()
  5. 输出:
  6. '''
  7. [[3 0 1 0]
  8. [0 2 0 0]
  9. [0 0 0 0]
  10. [0 0 0 1]]
  11. '''

3、csc_matrix

  • 介绍

  csc_matrix的初始化方法可以是bsr_matrix的初始化方法,也可以是coo_matrix的初始化方法

  • 优缺点:

  高效的CSC +CSC, CSC * CSC算术运算;高效的列切片操作。但是矩阵内积操作没有CSR, BSR快;行切片操作慢(相比CSR);稀疏结构的变化代价高(相比LIL 或者 DOK)。

  1. row = np.array([0, 0, 1, 3, 1, 0, 0])
  2. col = np.array([0, 2, 1, 3, 1, 0, 0])
  3. data = np.array([1, 1, 1, 1, 1, 1, 1])
  4. csc_mat=csc_matrix((data, (row, col)), shape=(4, 4)).toarray()
  5. 输出:
  6. '''
  7. [[3 0 1 0]
  8. [0 2 0 0]
  9. [0 0 0 0]
  10. [0 0 0 1]]
  11. '''

4、csr_matrix

  • 介绍

  csr_matrix的初始化与csc_matrix一致。

  • 优缺点

  高效的CSR + CSR, CSR *CSR算术运算;高效的行切片操作;高效的矩阵内积内积操作。但是列切片操作慢(相比CSC);稀疏结构的变化代价高(相比LIL 或者 DOK)。CSR格式在存储稀疏矩阵时非零元素平均使用的字节数(Bytes per Nonzero Entry)最为稳定(float类型约为8.5,double类型约为12.5)。CSR格式常用于读入数据后进行稀疏矩阵计算。

  1. row = np.array([0, 0, 1, 3, 1, 0, 0])
  2. col = np.array([0, 2, 1, 3, 1, 0, 0])
  3. data = np.array([1, 1, 1, 1, 1, 1, 1])
  4. csr_mat=csr_matrix((data, (row, col)), shape=(4, 4)).toarray()
  5. 输出:
  6. '''
  7. [[3 0 1 0]
  8. [0 2 0 0]
  9. [0 0 0 0]
  10. [0 0 0 1]]
  11. '''

5、dia_matrix

  • 介绍

  data定义对角线元素,在这里是[1,2,3,4]。

  offsets定义对角线的偏移量,0代表正对角线,正数代表往上偏移,负数代表往下偏移。

  • 优缺点

  对角存储格式(DIA)和ELL格式在进行稀疏矩阵-矢量乘积(sparse matrix-vector products)时效率最高,所以它们是应用迭代法(如共轭梯度法)解稀疏线性系统最快的格式;DIA格式存储数据的非零元素平均使用的字节数与矩阵类型有较大关系,适合于StructuredMesh结构的稀疏矩阵(float类型约为4.05,double类型约为8.10)。对于Unstructured Mesh以及Random Matrix,DIA格式使用的字节数是CSR格式的十几倍。

  1. data = np.array([[1, 2, 3, 4]]).repeat(3, axis=0)
  2. offsets = np.array([0, -1, 2])
  3. dia_mat=dia_matrix((data, offsets), shape=(4, 4)).toarray()
  4. 输出:
  5. '''
  6. [[1 0 3 0]
  7. [1 2 0 4]
  8. [0 2 3 0]
  9. [0 0 3 4]]
  10. '''

6、dok_matrix

  • 介绍

  dok_matrix从dict继承,它采用字典保存矩阵中不为0的元素:字典的键是一个保存元素(行,列)信息的元组,其对应的值为矩阵中位于(行,列)中的元素值。

  • 优缺点

  显然字典格式的稀疏矩阵很适合单个元素的添加、删除和存取操作。通常用来逐渐添加非零元素,然后转换成其它支持快速运算的格式。

  1. S = dok_matrix((5, 5), dtype=np.int)
  2. for i in range(5):
  3. for j in range(5):
  4. S[i, j] = i + j
  5. 输出:
  6. '''
  7. [[0 1 2 3 4]
  8. [1 2 3 4 5]
  9. [2 3 4 5 6]
  10. [3 4 5 6 7]
  11. [4 5 6 7 8]]
  12. '''

7、lil_matrix

  • 介绍

  基于行连接存储的稀疏矩阵。lil_matrix使用两个列表保存非零元素。data保存每行中的非零元素,rows保存非零元素所在的列。

  • 优缺点

  这种格式也很适合逐个添加元素,并且能快速获取行相关的数据。

  1. l = lil_matrix((6,5))
  2. l[2,3] = 1
  3. l[3,4] = 2
  4. l[3,2] = 3
  5. print (l.toarray())
  6. print(l.data)
  7. print(l.rows)
  8.  
  9. 输出
  10. '''
  11. [[0. 0. 0. 0. 0.]
  12. [0. 0. 0. 0. 0.]
  13. [0. 0. 0. 1. 0.]
  14. [0. 0. 3. 0. 2.]
  15. [0. 0. 0. 0. 0.]
  16. [0. 0. 0. 0. 0.]]
  17. [list([]) list([]) list([1.0]) list([3.0, 2.0]) list([]) list([])]
  18. [list([]) list([]) list([3]) list([2, 4]) list([]) list([])]

二、scipy.sparse中的矩阵函数

  下面我只列出比较有用的函数,其他的函数可以参见scipy.sparse官网。

构造函数

  • eye(m[, n, k, dtype, format]):对角线为1的稀疏矩阵
  • identity(n[, dtype, format]):单位矩阵
  • diags(diagonals[, offsets, shape, format, dtype]):构造对角矩阵(含偏移量)
  • spdiags(data, diags, m, n[, format]):从矩阵中返回含偏移量的对角稀疏矩阵
  • hstack(blocks[, format, dtype]) Stack sparse matrices horizontally (column wise) :在竖直方向上堆叠
  • vstack(blocks[, format, dtype]) Stack sparse matrices vertically (row wise):在水平方向上平铺

判别函数

  • issparse(x):x是否为sparse类型
  • isspmatrix(x):x是否为sparse类型
  • isspmatrix_csc(x):x是否为csc_matrix类型
  • isspmatrix_csr(x):x是否为csr_matrix类型
  • isspmatrix_bsr(x):x是否为bsr_matrix类型
  • isspmatrix_lil(x):x是否为lil_matrix类型
  • isspmatrix_dok(x):x是否为dok_matrix类型
  • isspmatrix_coo(x):x是否为coo_matrix类型
  • isspmatrix_dia(x):x是否为dia_matrix类型

其他有用函数

  • save_npz(file, matrix[, compressed]):以.npz格式保存稀疏矩阵
  • load_npz(file):导入.npz格式的稀疏矩阵
  • find(A):返回稀疏矩阵A中的非零元的位置以及数值

scipy.sparse中的作用在矩阵的内函数

  下面的函数只针对csr_matrix列出,其他稀疏矩阵格式的函数也类似,具体可以查看对应稀疏矩阵的说明文档下面的函数说明部分。

针对元素的函数

  内函数中有很多作用在矩阵元素的函数,下面列出一些函数。- arcsin():每个元素进行arcsin运算

  - floor():每个元素进行floor运算

  - sqrt():每个元素进行sqrt运算

  - maximum(other):比较稀疏矩阵与other矩阵的每个元素,返回最大值

转化函数

  • todense([order, out]):返回稀疏矩阵的np.matrix形式
  • toarray([order, out]):返回稀疏矩阵的np.array形式
  • tobsr([blocksize, copy]):返回稀疏矩阵的bsr_matrix形式
  • tocoo([copy]):返回稀疏矩阵的coo_matrix形式
  • tocsc([copy]):返回稀疏矩阵的csc_matrix形式
  • tocsr([copy]):返回稀疏矩阵的csr_matrix形式
  • todia([copy]):返回稀疏矩阵的dia_matrix形式
  • todok([copy]):返回稀疏矩阵的dok_matrix形式
  • tolil([copy]):返回稀疏矩阵的lil_matrix形式

其他函数

  • get_shape():返回稀疏矩阵的维度max([axis, out]):返回稀疏矩阵沿着某个轴的最大值
  • reshape(self, shape[, order, copy]):将稀疏矩阵的维度重构
  • diagonal([k]):返回第k个对角元素,但是在我的python3版本中k不起作用。
  • dot(other):与other矩阵的矩阵乘法

————————————————
参考文献:

https://blog.csdn.net/qq_33466771/article/details/80304498

https://blog.csdn.net/ChenglinBen/article/details/84424379

https://www.cnblogs.com/YangZnufe/p/8413374.html

https://blog.csdn.net/CY_TEC/article/details/106074237

scipy.sparse的一些整理的更多相关文章

  1. Python scipy.sparse矩阵使用方法

    本文以csr_matrix为例来说明sparse矩阵的使用方法,其他类型的sparse矩阵可以参考https://docs.scipy.org/doc/scipy/reference/sparse.h ...

  2. python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)

    print(train_set.tdm) print(type(train_set.tdm)) 输出得到: (0, 3200) 0.264940780338 (0, 1682) 0.356545827 ...

  3. Scipy.sparse矩阵的存储,读取和转化为稠密矩阵

    import numpy as np import scipy.sparse as sp m = sp.lil_matrix((7329,7329)) np.save(path,m) #用numpy的 ...

  4. Python SciPy Sparse模块学习笔记

    1. sparse模块的官方document地址:http://docs.scipy.org/doc/scipy/reference/sparse.html   2. sparse matrix的存储 ...

  5. scipy.sparse 稀疏矩阵

    from 博客园(华夏35度)http://www.cnblogs.com/zhangchaoyang 作者:Orisun 本文主要围绕scipy中的稀疏矩阵展开,也会介绍几种scipy之外的稀疏矩阵 ...

  6. Python 高维数组“稀疏矩阵”scipy sparse学习笔记

    scipy 里面的sparse函数进行的矩阵存储 可以节省内存 主要是scipy包里面的 sparse 这里目前只用到两个 稀疏矩阵的读取 sparse.load() 转稀疏矩阵为普通矩阵 spars ...

  7. scipy.sparse的csc_matrix、csr_matrix与coo_matrix区别与应用(思维导图)

  8. 常用Python库整理

    记录工作和学习中遇到和使用过的Python库. Target 四个Level 整理 Collect 学习 Learn 练习 Practice 掌握 Master 1. Python原生和功能增强 1. ...

  9. scipy科学计算库

    特定函数 例贝塞尔函数: 积分 quad,dblquad,tplquad对应单重积分,双重积分,三重积分 from scipy.integrate import quad,dblquad,tplqua ...

随机推荐

  1. optparse--强大的命令行参数处理包

    optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命令行说明. optparse的简单示例: from optparse import OptionPa ...

  2. Javascript基础之-var,let和const深入解析(二)

    你想在在变量声明之前就使用变量?以后再也别这样做了. 新的声明方式(let,const)较之之前的声明方式(var),还有一个区别,就是新的方式不允许在变量声明之前就使用该变量,但是var是可以得.请 ...

  3. mysql硬件优化

    导致宕机的原因: 1.      运行环境: 35%,运行环境可以看做是支持数据库服务器运行的系统和资源集合,包括操作系统,硬盘以及网络 2.      性能:35% 3.      复制 20% 4 ...

  4. 13、canvas操纵像素数据ImageData

    2019独角兽企业重金招聘Python工程师标准>>> 一.ImageData 对象 含义: 存储canvas对象真实的像素数据(每个像素块的RGBA色值) 属性: 1.width: ...

  5. Ubuntu Install Chinese Input Method

    为了提高在Linux系统使用中文输入的体验,安装搜狗拼音输入法. 确保键盘输入系统选中fcitx. 搜狗拼音输入法基于fcitx(Free Chinese Input Toy for X)框架,所以要 ...

  6. 程序猿使用Python的tkinter库进行GUI编程肯定要会的事件处理

    事件类型用户通过鼠标.键盘.游戏控制设备在与图形界面交互时,就会触发事件.tkinter事件通常采用了将事件名称放置于尖括号内的字符串表示,尖括号中的内容我们称之为事件类型.事件类型有其通用的定义方式 ...

  7. .NET Core技术研究-通过Roslyn代码分析技术规范提升代码质量

    随着团队越来越多,越来越大,需求更迭越来越快,每天提交的代码变更由原先的2位数,暴涨到3位数,每天几百次代码Check In,补丁提交,大量的代码审查消耗了大量的资源投入. 如何确保提交代码的质量和提 ...

  8. EditPlus编辑java代码 常规配置

  9. 变分深度嵌入(Variational Deep Embedding, VaDE)

    变分深度嵌入(Variational Deep Embedding, VaDE) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 这篇博文主要是对论文“ ...

  10. [hdu1242]优先队列

    题意:给一个地图,'x'走一步代价为2,'.'走一步代价为1,求从s到t的最小代价.裸优先队列. #pragma comment(linker, "/STACK:10240000,10240 ...