稀疏矩阵是一种特殊的矩阵,其非零元素数目远远少于零元素数目,并且非零元素分布没有规律。
这种矩阵在实际应用中经常出现,例如在物理学、图形学和网络通信等领域。

稀疏矩阵其实也可以和一般的矩阵一样处理,之所以要把它区分开来进行特殊处理,是因为:
一方面稀疏矩阵存储空间开销通常比稠密矩阵要小得多,可以节省存储空间;
另一方面,在计算稀疏矩阵时,可以利用其特殊的结构,采用专门的算法,提高计算效率和准确性。
因此,稀疏矩阵Scipy库中被单独作为一个模块,以便被更好地处理和应用。

1. 主要功能

稀疏矩阵子模块(scipy.sparse)的主要功能包括:

类别 说明
稀疏数组类 支持各种格式的稀疏数组
稀疏矩阵类 支持各种格式的稀疏矩阵
稀疏矩阵工具 构建,保存,加载以及识别稀疏矩阵的各种函数
其他 包含压缩稀疏图例程,稀疏线性代数等子模块,以及一些异常处理方法

这里有个需要注意的地方是稀疏数组稀疏矩阵的区别。
这两个类别中的很多函数名称也类似,比如:bsr_arraybsr_matrixcoo_arraycoo_matrix等等。

只要区别在于:
***_matrix类的函数是一种基于Compressed Sparse Row(CSR)和Compressed Sparse Column(CSC)格式的块稀疏矩阵表示方法。
它使用一个字典来存储非零元素,其中每个元素对应于一个包含三个值的元组,分别表示该元素的行索引、列索引和非零元素的值。
这种数据结构可以提供更好的计算性能和内存使用效率,特别适合于大规模的块稀疏矩阵计算。

***_array 类的函数虽然类似于***_matrix的数据结构,但它允许更大的灵活性。
***_array 可以表示任意的稀疏数组,而不仅仅是块稀疏矩阵。
它使用一个具有三个数组的元组来表示稀疏数组,其中第一个数组存储行索引,第二个数组存储列索引,第三个数组存储非零元素的值。
这种数据结构适用于更通用的稀疏数组计算,但可能不如***_matrix高效。

总之,***_matrix***_array都是用于表示块稀疏矩阵或稀疏数组的数据结构。
***_matrix更适合于大规模的块稀疏矩阵计算,而***_array适用于更通用的稀疏数组计算。

2. 使用示例

稀疏矩阵之所以成为单独的一个模块,是因为它的稀疏的特性在很多领域多有广泛的应用。
scipy.sparse子模块中提供了大概7种

  1. csc_matrix: 压缩稀疏列格式(Compressed Sparse Column)
  2. csr_matrix: 压缩稀疏行格式(Compressed Sparse Row)
  3. bsr_matrix: 块稀疏行格式(Block Sparse Row)
  4. lil_matrix: 列表格式的列表(List of Lists format)
  5. dok_matrix: 键格式字典(Dictionary of Keys)
  6. coo_matrix: 坐标格式(又名 IJV,三元组格式)
  7. dia_matrix: 对角线格式(DIAgonal format)

2.1. 使用稀疏矩阵

稀疏矩阵其实在运算上和使用普通矩阵一样。
首先,构造一个创建矩阵的方法create_matrix,这个方法会生成一个10x10的矩阵,
方法的参数N表示随机在矩阵的N个位置中生成值。

from scipy import sparse
import numpy as np # 创建一个10x10矩阵,其中有值的元素不超过N个
def create_matrix(N):
data = np.zeros((10, 10)) for _ in range(N):
row = np.random.randint(0, 10, 1)
col = np.random.randint(0, 10, 1)
data[row, col] = np.random.randint(1, 100, 1) return data

create_matrix创建的是普通矩阵,我们将生成的矩阵转换为稀疏矩阵后,计算方式差不多。

# 创建两个普通矩阵
m1 = create_matrix(8)
m2 = create_matrix(6) # 计算点积
m1.dot(m2) # 返回m1和m2的点积结果 # 将普通矩阵变为稀疏矩阵
#(这里的演示用了7种类型中的一种bsr)
d1 = sparse.bsr_matrix(m1)
d2 = sparse.bsr_matrix(m2) # 计算点积后,用toarray方法转换为二维数组
d1.dot(d2).toarray()

从上面的代码可以看出,用scipy.sparse中的稀疏矩阵和使用一般矩阵差不多。

2.2. 稀疏矩阵的性能

我们使用稀疏矩阵,就是因为其运算性能比使用一般矩阵强,否则还不如直接用一般矩阵。
下面,简单测试下scipy.sparse模块下稀疏矩阵的性能。

先看其内存占用是否有减少,为了让性能差别能显著看出,
先扩大测试矩阵为 1000x1000

import sys

def create_matrix(N):
data = np.zeros((1000, 1000)) for _ in range(N):
row = np.random.randint(0, 1000, 1)
col = np.random.randint(0, 1000, 1)
data[row, col] = np.random.randint(1, 100, 1) return data m1 = create_matrix(8)
m2 = create_matrix(6) d1 = sparse.csr_matrix(m1)
d2 = sparse.csr_matrix(m2) print("一般矩阵 m1 占用的空间:{}".format(sys.getsizeof(m1)))
print("一般矩阵 m2 占用的空间:{}".format(sys.getsizeof(m2)))
print("一般矩阵 d1 占用的空间:{}".format(sys.getsizeof(d1)))
print("一般矩阵 d2 占用的空间:{}".format(sys.getsizeof(d2)))
# 运行结果:
一般矩阵 m1 占用的空间:8000128
一般矩阵 m2 占用的空间:8000128
一般矩阵 d1 占用的空间:56
一般矩阵 d2 占用的空间:56

可以看出占用的空间明显缩小了。

再看点积的运算性能:(运行10轮,每轮100次)

%%timeit -r 10 -n 100
m1.dot(m2)
# 运行结果:
10.6 ms ± 136 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)

稀疏矩阵的点积运算:

%%timeit -r 10 -n 100
d1.dot(d2)
# 运行结果:
137 µs ± 14.3 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)

可以看出,运算性能差别非常大,一个是毫秒级别10.6ms)的,一个是微秒级别137 µs)的。

3. 总结

稀疏矩阵在矩阵中只是一种特殊的矩阵,然而在实际应用领域中,却应用极广,比如:
数值计算中,可以用于解决大规模线性代数方程组、大规模非线性方程组和非线性优化问题,以及求解大规模约束规划问题。

模式识别中,如人脸识别、手写数字识别、文本分类等任务,可用于表示高维数据,提取特征并进行降维,提高识别准确率和计算效率。

推荐系统中,处理大量用户和物品的数据时,稀疏矩阵可以有效地表示这些数据。

社交网络中,因为一般社交关系都是稀疏的,所以可用于分析社交网络的结构和行为,例如社区检测、影响力传播。

此外,还可以用在计算机视觉自然语言处理生物信息学等等领域。
所以,研究稀疏矩阵有其重要的实际意义。

【scipy 基础】--稀疏矩阵的更多相关文章

  1. SciPy 基础功能

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  2. scipy构建稀疏矩阵

    from scipy.sparse import csr_matrix import numpy as np indptr = np.array([0, 2, 3, 6]) indices = np. ...

  3. scipy.sparse 稀疏矩阵

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

  4. Python教程:进击机器学习(五)--Scipy《转》

    Scipy简介 文件输入和输出scipyio 线性代数操作scipylinalg 快速傅里叶变换scipyfftpack 优化器scipyoptimize 统计工具scipystats Scipy简介 ...

  5. SciPy 介绍

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  6. 1.5 Scipy:高级科学计算

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...

  7. python-数据处理的包Numpy,scipy,pandas,matplotlib

    一,NumPy包(numeric python,数值计算) 该包主要包含了存储单一数据类型的ndarry对象的多维数组和处理数组能力的函数ufunc对象.是其它包数据类型的基础.只能处理简单的数据分析 ...

  8. 统计学习方法 | 第1章 统计学习方法概论 | Scipy中的Leastsq()

    Scipy是一个用于数学.科学.工程领域的常用软件包,可以处理插值.积分.优化.图像处理.常微分方程数值解的求解.信号处理等问题.它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解 ...

  9. SciPy 信号处理

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  10. SciPy 统计

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

随机推荐

  1. 双URL编码绕过WAF

    一般编码一次是%5c. 但攻击者怕这个会被认出来,所以用二次编码,把%本身编码成%25.再和后边拼成%255c. 如果URL解码器有缺陷,只不断重复"从前边开始解析"这个步骤,就会 ...

  2. 解读 --- System.Windows.Forms.Timer是前台线程吗?

    引言 今天同事问了我一个问题,System.Windows.Forms.Timer是前台线程还是后台线程,我当时想的是它是跟着UI线程一起结束的,应该是前台线程吧? 我确实没有仔细研究过他们的异同,所 ...

  3. cesium 绑定dom弹窗(跟随模型)

    https://blog.csdn.net/qq_36266612/article/details/109648367?utm_term=cesium%E6%80%8E%E4%B9%88%E6%B7% ...

  4. PoW是什么?

    PoW是什么? 工作量证明(proof of work,PoW)是一种用于确认和验证区块链交易和新区块有效性的共识算法.区块链中常见的工作量证明算法包括比特币的SHA-256.以太坊的Ethash.莱 ...

  5. 重学HTTP:理解同源策略和CORS

    ​每次遇到跨域.代理.CORS这几个词都懵懵的,我决定一次把他们都搞明白,以后遇到他们再也不用害怕了. 一.什么是同源策略? 同源策略是在1995年由 Netscape公司引入到浏览器的,目前所有浏览 ...

  6. SpringBoot3安全管理

    目录 一.简介 二.工程搭建 1.工程结构 2.依赖管理 三.配置管理 1.核心配置类 2.认证数据源 3.认证流程 4.身份过滤器 四.核心功能 1.登录退出 2.权限校验 五.参考源码 标签:Se ...

  7. Spring HandlerInterceptor工作机制

    本文以一个通过正常注册拦截器流程注册拦截器失败的实际场景,来带领大家阅读源码,体会Spring的HandlerInterceptor拦截器整个工作流程 简单认识 org.springframework ...

  8. 浅析 GlusterFS 与 JuiceFS 的架构异同

    在进行分布式文件存储解决方案的选型时,GlusterFS 无疑是一个不可忽视的考虑对象.作为一款开源的软件定义分布式存储解决方案,GlusterFS 能够在单个集群中支持高达 PiB 级别的数据存储. ...

  9. crontab定时任务不执行的一些原因总结

    参考博文地址: https://www.jb51.net/article/154290.htm声明:本文章是在以上地址博文基础上进行整理学习,如有侵权,请联系博主删除,感谢知识共享,一起进步,加油鸭 ...

  10. 2018-D

    2018-D 新建数据库 test0317,目录为考试目录,并在完成建表后备份 1.建表: use [test0317]; create table [STD_INFO]( [std_id] int ...