返回顶部
首页 > 资讯 > 后端开发 > Python >python的高级数组之稀疏矩阵
  • 542
分享到

python的高级数组之稀疏矩阵

稀疏数组矩阵 2023-01-31 00:01:11 542人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

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

 

  1. 稀疏矩阵的定义:

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

稀疏矩阵的两个动机:稀疏矩阵通常具有很大的维度,有时甚大到整个矩阵(零元素)与可用内存不想适应;另一个动机是避免零矩阵元素的运算具有更好的性能。

  1. 稀疏矩阵的格式

存储矩阵的一般方法是采用二维数组,其优点是可以随机地访问每一个元素,因而能够容易实现矩阵的各种运算。对于稀疏矩阵,采用二维数组的存储方法既浪费大量的存储单元来存放零元素,又要在运算中浪费大量的时间来进行零元素的无效运算。因此必须考虑对稀疏矩阵进行压缩存储(只存储非零元素)。

Scipy.sparse模块提供了许多来自于稀疏矩阵的不同存储格式。这里仅描述最为重要的格式CSR、CSC和LIL。CSR、CSC是用于矩阵-矩阵和矩阵-向量运算的有效格式,LIL格式用于生成和更改稀疏矩阵。python不能自动创建稀疏矩阵,所以要用scipy中特殊的命令来得到稀疏矩阵。

(1) 压缩稀疏行(CSR,Compressed Sparse Row):或csr_matrix  按行对矩阵进行压缩的。

   CSR使用了三个数组,分别为数值、行偏移(表示某一行的第一个元素在数值里面的起始偏移位置,在行偏移的最后补上矩阵总的元素个数)、列号。CSR是一种编码的方式

一维数组data(数值):有序地存储了所有的非零值,它具有与非零元素同样多数量的元素,通常由变量nnz表示。

一维数组indptr(行偏移量):包含了证书使得indptr[i]是data中元素的索引,它是行i中的第一个非零元素。如果整个行i为零,则indptr[i]==indptr[i+1]

如初始矩阵有m行,则len(indptr)==m+1

一维数组Indices(列号:): 其使用如下方式包含列索引信息:indices[indptr[i]:indptr[i+1]]是一个具有行i中非零元素的列索引的整数数组。Len(indice)==len(data)==nnz

 

备注:列索引表示数值所在的列号,从0开始。

      数组data:包含矩阵中的非零元素,以行优先的形式保存。

    行偏移:CSR中行索引被压缩,没有行索引,这里用行偏移表示行索引。

实例:

             

如上图所示:data=(1,7,2,8,5,3,9,6,4)

            Indices=(0,1,1,2,0,2,3,1,3)    #列索引

            Indptr=(0,2,4,7,9)  #行偏移(表示某一行的第一个元素在数值里面的起始偏移位置,在行偏移的最后补上矩阵总的元素个数)

Python中使用:

import numpy as np

from scipy.sparse import csr_matrix

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

A=csr_matrix((data, indices, indptr), shape=(3, 3)).toarray() #生成CSR格式的矩阵

print(A)    #运行结果:

[[1 0 2]

 [0 0 3]

 [4 5 6]]

     解析:第i行的列索引存储在indices[indptr[i]:indptr[i+1]]中,对应的值为data[indptr[i]:indptr[i+1]]。即例如第0行的列索引为indices[0:2]=[0,2](第i行中非零元素的列索引组成的整数数组),值为data[0:2]=[1,2];第1行的列索引为indices[2:3]=[2],值为data[2:3]=[3]…

(2) 稀疏列矩阵CSC(Compressed Sparse Column),用于CSC格式的类型为:csc_matrix  按列对矩阵进行压缩的。

  与CSR格式相比唯一的不同点是indptr和indices数组的定义,该定义与列有关。

CSC格式的实例:

import numpy as np

import scipy.sparse as sp

A=np.array([[1,0,2,0],[0,0,0,0],[3,0,0,0],[1,0,0,4]])

AS=sp.csc_matrix(A)

Print(AS)

print(AS.data)

print(AS.indptr)

print(AS.indices)

print(AS.nnz)    #运行结果:

[1 3 1 2 4]

[0 3 3 4 5]     #注意此处,同一矩阵CSR格式的indptr为[0 2 2 3 5]

[0 2 3 0 3]

5

(3) 基于行的链表格式:LIL(Row-Based Linked List Format)

 1. 链表稀疏格式在列表数据中以行方式存储非零元素,

列表data: data[k]是行k中的非零元素的列表。如果该行中的所有元素都为0,则它包含一个空列表。

列表rows: 是在位置k包含了在行k中的非零元素列索引列表。

LIL格式的同一示例:

import numpy as np

import scipy.sparse as sp

A=np.array([[1,0,2,0],[0,0,0,0],[3,0,0,0],[1,0,0,4]])

AS=sp.lil_matrix(A)

print(AS.data)

print(AS.rows)

print(AS.nnz)  #运行结果:

[list([1, 2]) list([]) list([3]) list([1, 4])]

[list([0, 2]) list([]) list([0]) list([0, 3])]

5

 2. 用LIL格式更改和切割矩阵:

LIL格式最适合切片的方法,即以LIL格式提取子矩阵,并通过插入非零元素来改变稀疏模式。

例如:提取

import numpy as np

import scipy.sparse as sp

A=np.array([[1,0,2,0],[0,0,0,0],[3,0,0,0],[1,0,0,4]])

AS=sp.lil_matrix(A)

print(AS)

BS=AS[0:2,0:3]      #切片提取0,1行,0,1,2列组成的子矩阵

print(BS)

print(BS.data)

print(BS.rows)   

#运行结果:

  (0, 0)        1

  (0, 2)        2

[list([1, 2]) list([])]

[list([0, 2]) list([])]

更改:插入新的非零元素会自动更新属性

AS[0,1]=17

print(AS.data)

print(AS.rows)

print(AS.nnz)  

#结果: [list([1, 17, 2]) list([]) list([3]) list([1, 4])]

[list([0, 1, 2]) list([]) list([0]) list([0, 3])]

6

  1. 生成稀疏矩阵:

Numpy包的命令eye、identity、diag和rand都有其对应的稀疏矩阵,这些命令需要额外的参数来指定所得矩阵的稀疏矩阵格式。

import numpy as np

import scipy.sparse as sp

print(sp.eye(20,20,fORMat = 'lil'))

print(sp.spdiags(np.ones((20,)),0,20,20,format = 'csr'))

print(sp.identity(20,format = 'csc'))

print(sp.rand(20,200,density=0.1,format='csr'))    #sp.rand命令需要额外的参数来描述生成随机矩阵的密度。

  1. 稀疏矩阵方法

将稀疏矩阵类型转换为另一种类型和数据或数组的方法:

AS.toarray  #转换稀疏矩阵类型为数组

AS.tocsr

AS.tocsc

AS.tolil

 

#通过issparse、isspmatrix_lil、isspmatrix_csc、isspmatrix_csr等方法检查稀疏矩阵的类型。

import numpy as np

import scipy.sparse as sp

A=np.array([[1,0,2,0],[0,0,0,0],[3,0,0,0],[1,0,0,4]])

def sparse_sin(A):

    if not (sp.isspmatrix_csr(A) or sp.isspmatrix_csc(A)):

        A=A.tocsr()

        A.data=sin(A.data)

        return(A)

B=sparse_sin(A)

print(B)

 

#稀疏矩阵方法的dot,用于矩阵-矩阵或者矩阵-向量乘法运算,返回csr_matrix或Numpy array

例如:import numpy as np

import scipy.sparse as sp

A=np.array([[1,0,2,0],[0,0,0,0],[3,0,0,0],[1,0,0,4]])

AS=sp.csr_matrix(A)

b=np.array([1,2,3,4])

c=AS.dot(b)     #结果为:[ 7  0 3  17]

print(c)

c=AS.dot(AS)        #结果仍为稀疏矩阵

print(c)

d=np.dot(AS,b)

print(d)     #不能返回期望的结果

--结束END--

本文标题: python的高级数组之稀疏矩阵

本文链接: https://lsjlt.com/news/181657.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python的高级数组之稀疏矩阵
      稀疏矩阵的定义: 具有少量非零项的矩阵(在矩阵中,若数值0的元素数目远多于非0元素的数目,并且非0元素分布没有规律时,)则称该矩阵为稀疏矩阵;相反,为稠密矩阵。非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。 稀疏矩阵的两个动...
    99+
    2023-01-31
    稀疏 数组 矩阵
  • numpy稀疏矩阵的实现
    目录1. coo存储方式2. dok_matrix3. csr和csc存储方式4. lil_matrix5. dia_matrix6. 稀疏矩阵经验1. coo存储方式 采用三元组(...
    99+
    2024-04-02
  • python scipy 稀疏矩阵的使用说明
    稀疏矩阵格式 coo_matrix coo_matrix 是最简单的稀疏矩阵存储方式,采用三元组(row, col, data)(或称为ijv format)的形式来存储矩阵中非零元素的信息。 在实际使用中,一般...
    99+
    2022-06-02
    python scipy 稀疏矩阵
  • Scipy稀疏矩阵bsr_array的使用
    目录基本原理初始化内置方法基本原理 bsr,即Block Sparse Row,bsr_array即块稀疏行矩阵,顾名思义就是将稀疏矩阵分割成一个个非0的子块,然后对这些子块进行存储...
    99+
    2023-02-21
    Scipy稀疏矩阵bsr_array Scipy稀疏矩阵 Scipy bsr_array
  • Python 如何解决稀疏矩阵运算
    用Python求解微分线性方程 因为之前用matlab也编写过,所以前不久试着用python写,感觉之间互通点也蛮多的,易理解。 题目:稀疏线性方程组的求解方法 简单的方程如: AX...
    99+
    2024-04-02
  • Python稀疏矩阵scipy.sparse包使用详解
    目录1. 前言2. 导入包3. 稀疏矩阵总览4. 稀疏矩阵详细介绍4.1 coo_matrix4.2 dok_matrix4.3 lil_matrix4.4 dia_matrix4....
    99+
    2023-02-16
    Python稀疏矩阵 Python scipy.sparse包
  • 华为OD机试 - 矩阵稀疏扫描(Java & JS & Python)
    题目描述 如果矩阵中的许多系数都为零,那么该矩阵就是稀疏的。对稀疏现象有兴趣是因为它的开发可以带来巨大的计算节省,并且在许多大的实践中都会出现矩阵稀疏的问题。 给定一个矩阵,现在需要逐行和逐列地扫描矩阵,如果某一行或者某一列内,存在连续出现...
    99+
    2023-09-01
    算法 华为机试 Java JavaScript Python
  • Python实现两种稀疏矩阵的最小二乘法
    目录最小二乘法返回值测试最小二乘法 scipy.sparse.linalg实现了两种稀疏矩阵最小二乘法lsqr和lsmr,前者是经典算法,后者来自斯坦福优化实验室,据称可以比lsqr...
    99+
    2023-02-26
    Python稀疏矩阵最小二乘法 Python稀疏矩阵 Python 最小二乘法
  • Python如何实现两种稀疏矩阵的最小二乘法
    今天小编给大家分享一下Python如何实现两种稀疏矩阵的最小二乘法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。最小二乘法s...
    99+
    2023-07-05
  • java实现稀疏矩阵的压缩与解压的方法
    目录任务要求思路分析稀疏矩阵的压缩稀疏矩阵的解压代码实现任务要求 把棋盘当作一个稀疏矩阵,0表示没棋,1表示黑棋,2表示蓝棋。 把该稀疏矩阵压缩以三元组形式表示并以文件形式保存,再写...
    99+
    2024-04-02
  • scipy稀疏数组coo_array的实现
    目录coo_array初始化方案内置方法coo_array coo也被称为ijv,是一种三元组格式,对于矩阵中第i ii行第j jj列的值v vv,将其存储为( i , j , v ...
    99+
    2023-02-21
    scipy稀疏数组coo_array scipy稀疏数组
  • 【华为OD统一考试B卷 | 100分】矩阵稀疏扫描(C++ Java JavaScript Python)
    华为OD在线OJ 已购买本专栏用户,请私信博主开通账号,在线刷题!!! 在线OJ:立即刷题 题库专栏:2023华为OD机试(A卷+B卷)(C++JavaJSPy) 题目描述 如果矩阵中的许多系数都为零...
    99+
    2023-10-05
    矩阵 c++ java python 华为
  • java稀疏数组的示例代码
    稀疏组织 当一个数组中大部分元素为0,或者为同一个值的数组时,可以用稀疏数组来保存该数组稀疏数组,记录一共有几行几列,有多少个不同值把具有不同值的元素和行里了及值记录在一个小规模的数...
    99+
    2024-04-02
  • Java编程内功之怎么用稀疏数组
    这篇文章主要讲解了“Java编程内功之怎么用稀疏数组”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java编程内功之怎么用稀疏数组”吧! 基本介绍当一个数组中大部分元素为0,或者为...
    99+
    2023-06-15
  • Java实现二维数组和稀疏数组之间的转换
    目录前言 1. 需求和思路分析 2.代码实现和展示 3. 总结 参考视频前言 用Java实现二维数据和稀疏数组之间的转换 1. 需求和思路分析 1.1 以二维数组的格式模拟棋盘、...
    99+
    2024-04-02
  • golang数据结构之golang稀疏数组sparsearray详解
    目录一、稀疏数组1. 先看一个实际的需求2. 基本介绍3. 应用实例一、稀疏数组 1. 先看一个实际的需求 编写的五子棋程序中,有存盘退出和续上盘的功能 分析按照原始的方式来的二维...
    99+
    2024-04-02
  • Java数据结构之稀疏数组的实现与应用
    目录1.稀疏数组引入1.1 使用场景1.2 稀疏数组简介2.稀疏数组的实现2.1 案例概述2.2 思路分析2.3 代码实现1.稀疏数组引入 1.1 使用场景 笔者在课程设计中曾写过一...
    99+
    2022-11-13
    Java 数据结构 稀疏数组 Java 稀疏数组
  • java稀疏数组的代码怎么写
    这篇文章主要介绍了java稀疏数组的代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java稀疏数组的代码怎么写文章都会有所收获,下面我们一起来看看吧。稀疏组织当一个数组中大部分元素为0,或者为同一个值...
    99+
    2023-07-02
  • scipy稀疏数组dok_array的具体使用
    dok_array dok数组就是通过键值对存储的数组,其中key就是矩阵中的坐标元组,value就是对应坐标中的值,是最容易理解的稀疏矩阵存储方案。 >>> im...
    99+
    2023-02-23
    scipy稀疏数组dok_array scipy dok_array
  • Python多维数组和矩阵
    注:每一步可能依赖于上一步import的模块 一、数组 1,用numpy对数组进行运算 from numpy import array mm=array((1, 1, 1)) pp=array((1, 2, 3)) 则pp+mm 输出...
    99+
    2023-01-31
    多维 数组 矩阵
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作