对于一个矩阵而言,若数值为零的元素远远多于非零元素的个数,且非零元素分布没有规律时,这样的矩阵被称作稀疏矩阵;与之相反,若非零元素数目占据绝大多数时,这样的矩阵被称作稠密矩阵。

稀疏矩阵在工程应用中经常被使用,尤其是在通信编码和机器学习中。若编码矩阵或特征表达矩阵是稀疏矩阵时,其计算速度会大大提升。对于机器学习而言,稀疏矩阵应用非常广,比如在数据特征表示、自然语言处理等领域。用稀疏表示和工作在计算上代价很高,需要专门处理稀疏矩阵的表示和操作等,但是这些操作可以大幅提升性能。

Python中的稀疏矩阵

SciPy使用多个数据结构为创建稀疏矩阵提供了工具,以及将稠密矩阵转化为稀疏矩阵的工具。许多在Numpy数组上运行的线性代数Numpy和SciPy函数可以在SciPy稀疏数组上操作。此外,使用Numpy数据结构的机器学习库也可以在Scipy稀疏数组上操作,例如,用于机器学习的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

coo_matrix是最简单的存储方式。采用三个数组row、col和data保存非零元素的行下标,列下标与值。这三个数组的长度相同。一般来说,coo_matrix主要用来创建矩阵,因为coo_matrix无法对矩阵的元素进行增删改等操作,一旦创建之后,除了将之转换成其它格式的矩阵,几乎无法对其做任何操作和矩阵运算。>>> 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 ''

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]])

优点:转换成其它存储格式很快捷简便,转换成csr/csc很快

允许重复的索引(例如在1行1列处存了值2.0,又在1行1列处存了值3.0,则转换成其它矩阵时就是2.0+3.0=5.0)

缺点:不支持切片和算术运算操作

dok_matrix与lil_matrix

dok_matrix和lil_matrix适用的场景是逐渐添加矩阵的元素。dok_matrix的策略是采用字典来记录矩阵中不为0的元素。所以字典的key存的是记录元素的位置信息的元祖,value是记录元素的具体值。>>> 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.]]

优点:对于递增的构建稀疏矩阵很高效,比如定义该矩阵后,想进行每行每列更新值,可用该矩阵。当访问某个单元,只需要O(1)

缺点:不允许重复索引(coo中适用),但可以很高效的转换成coo后进行重复索引

lil_matrix则是使用两个列表存储非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与csc_matrix

csr_matrix是按行对矩阵进行压缩的,csc_matrix是按列对矩阵进行压缩的。通过row_offsets,column_indices,data来确定矩阵。column_indices,data与coo格式的列索引与数值的含义完全相同,row_offsets表示元素的行偏移量。

用如下例子说明:>>> indptr = np.array([0, 2, 3, 6]) # 元素的行偏移量

>>> indices = np.array([0, 2, 2, 0, 1, 2]) # 列索引

>>> data = np.array([1, 2, 3, 4, 5, 6])

>>> csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()

array([[1, 0, 2],

[0, 0, 3],

[4, 5, 6]])

CSR格式常用于读入数据后进行稀疏矩阵计算。

CSR:

优点:高效的稀疏矩阵算术操作

高效的行切片

快速地矩阵向量内积操作

缺点:缓慢地列切片操作(可以考虑csc)

转换到稀疏结构代价较高(可以考虑lil,dok)CSC:

优点:

高效的稀疏矩阵算术操作

高效的列切片

快速地矩阵向量内积操作(不如csr,bsr块)

缺点:缓慢地行切片操作(可以考虑csr)

转换到稀疏结构代价较高(可以考虑lil,dok)

稀疏矩阵的存取

用save_npz保存单个稀疏矩阵>>> scipy.sparse.save_npz('sparse_matrix.npz', sparse_matrix)

>>> sparse_matrix = scipy.sparse.load_npz('sparse_matrix.npz')

python中矩阵的表示方法,稀疏矩阵在Python中的表示方法相关推荐

  1. python画矩阵热图_如何用python的matplotlib绘制热图

    python使用matplotlib绘制热图 python常用的绘图库就是matplotlib,今天在给公司绘图时,偶然间发现matplotlib可以绘制热图,并且十分简洁,拿出来跟大家分享一下.(由 ...

  2. java中矩阵怎么打印_在Java编程中打印二维数组或矩阵

    在本文中,我们将尝试以与通常在纸上书写相同的方式在控制台上打印数字数组或数字矩阵. 为此,逻辑是一个接一个地访问数组的每个元素,并使其以空格分隔打印,当行到达矩阵中的emd时,我们还将更改行 示例 p ...

  3. python将矩阵顺时针旋转90度_在Python中将方形矩阵逆时针旋转90度的程序

    假设我们有一个正方形矩阵,我们必须将其逆时针旋转90度.147 258 369 那么输出将是789 456 1个23 为了解决这个问题,我们将遵循以下步骤-如果矩阵为空,则返回一个空白列表 n:=矩阵 ...

  4. python创建矩阵_Python创建对称矩阵的方法示例【基于numpy模块】

    本文实例讲述了Python创建对称矩阵的方法.分享给大家供大家参考,具体如下: 对称(实对称)矩阵也即: step 1:创建一个方阵 >>> import numpy as np & ...

  5. python中矩阵的表示方法_关于Python表示矩阵的方法详解

    这篇文章主要介绍了Python表示矩阵的方法,结合具体实例形式分析了Python表示矩阵的方法与相关操作注意事项,需要的朋友可以参考下 本文实例讲述了Python表示矩阵的方法.分享给大家供大家参考, ...

  6. fun是什么意思 python中def_【python】 numpy中的矩阵转置(ndarray.T)为什么不加括号却可以实现方法的功能...

    [python] numpy中的矩阵转置(ndarray.T)为什么不加括号却可以实现方法的功能 经过搜索和查询源码了解到,.T就是一个方法,但是是被装饰器修饰了一下... @property是pyt ...

  7. python中的除法运算_python中矩阵除法运算的三种实现方法

    介绍过python矩阵的乘法运算,numpy库中虽然乘法是矩阵运算的主要运算,但是numpy作为python中实现矩阵运算的好工具,也是可以轻松实现除法计算的,本文python中矩阵除法的三种实现方法 ...

  8. python中矩阵加法_Python实现矩阵加法和乘法的方法分析

    本文实例讲述了python实现矩阵加法和乘法的方法.分享给大家供大家参考,具体如下: 本来以为python的矩阵用list表示出来应该很简单可以搞..其实发现有大学问. 这里贴出我写的特别不pytho ...

  9. python中矩阵转置4种方法

    文章目录 1. 使用双重循环 2. 使用列表表达式 3. 使用zip函数 4. 使用numpy模块 1. 使用双重循环 # python 双重循环arr = [[ 1, 2, 3],[ 4, 5, 6 ...

最新文章

  1. 赠书 | 熵的实际应用,赌场和金融圈最著名的一个数学公式
  2. 薛定谔的流量杠杆,网红电商上市的激励与诅咒
  3. 设置程序中的html,如何在Behat中为HTML格式化程序设置自定义模板
  4. AAAI 2020 开源论文 | 语义感知BERT(SemBERT)
  5. android四个组件的跨进程通信
  6. 个人随笔-《江城子·驻西航》
  7. mysql ubuntu client_ubuntu 安装 mysqlclient
  8. win7窗口颜色没有透明的开启教程
  9. iOS里面MVC模式详解
  10. vs2008 调试时不会命中断点,源代码与原始版本不同,解决办法
  11. 透过一个编译报错,总结两个Go程序编译的重要知识
  12. C#利用SharpZipLib解压或压缩文件夹实例操作
  13. 书籍推荐——按角色划分
  14. [第2节]数组,链表,跳表及其实际应用
  15. Python操作PDF与Tiff文件
  16. COGS 2507 零食店
  17. firework cs4入门
  18. 关于NLPIR在MAC上的使用
  19. 比原链CEO朗豫:DeFi让用户真正理解区块链,意义重大
  20. 工业大数据竞赛的轴承数据集

热门文章

  1. 这首王维的古诗该如何解析?
  2. datafountain自然语言处理比赛的学习和总结
  3. Discuz更改帖子标题的字符长度限制
  4. Mysql的锁以及MVCC解决事务隔离级别
  5. matlab计算连续复利,Code 2-1 单利、离散复利与连续复利的对比
  6. 数字大写 php 代码,PHP 中文大写数字 转成 数字代码
  7. 杭州银行客服中心的智能化转型之路
  8. 影驰gtx960显卡怎么样_影驰gtx960 2g_影驰gtx960 2g跑分
  9. 2021-DASCTF-三月赛-Writeup
  10. MySQL中建表时 pk、nn、qu、b、un、zf、ai、g代表的意思