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

稀疏矩阵其实也可以和一般的矩阵一样处理,之所以要把它区分开来进行特殊处理,是因为:
一方面稀疏矩阵存储空间开销通常比稠密矩阵要小得多,可以节省存储空间;
另一方面,在计算稀疏矩阵时,可以利用其特殊的结构,采用专门的算法,提高计算效率和准确性。
因此,稀疏矩阵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. opencv-python中 boundingRect(cnt)以及cv2.rectangle用法

    矩形边框(Bounding Rectangle)是说,用一个最小的矩形,把找到的形状包起来.还有一个带旋转的矩形,面积会更小,效果见下图 首先介绍下cv2.boundingRect(img)这个函数 ...

  2. Singleton Pattern 单例模式简介与 C# 示例【创建型】【设计模式来了】

    〇.简介 1.什么是单例模式? 一句话解释:   单一的类,只能自己来创建唯一的一个对象. 单例模式(Singleton Pattern)是日常开发中最简单的设计模式之一.这种类型的设计模式属于创建型 ...

  3. SpringBoot3进阶用法

    标签:切面.调度.邮件.监控: 一.简介 在上篇<SpringBoot3基础>中已经完成入门案例的开发和测试,在这篇内容中再来看看进阶功能的用法: 主要涉及如下几个功能点: 调度任务:在应 ...

  4. 原来你是这样的JAVA--目录

    .NET程序员转Java过程中遇到的一些经验分享,陆续更新中. 原来你是这样的Java[01]--基础一瞥 原来你是这样的Java[02]-包.传参.构造器 原来你是这样的Java[03]-继承.多态 ...

  5. day01 java 数据类型

    数据类型   1. 数值型:整数类型 byte   short   int   long 浮点类型 double float 基本数据类型:2.字符型:char 3.布尔型:boolean    1. ...

  6. SQL运用full join连接,decode函数,nvl函数进行列转行

    背景说明:full join连接,decode函数,nvl函数,结合生产背景理解更深刻: test_A表是现金业主某时间段的收益:test_B表是非现金业主某时间段的收益:对于业主,test_A表与t ...

  7. 汇编debug的安装

    实验一查看CPU和内存,用机器指令和汇编指令编程 在做实验前需要debug命令. 工具:dosbox,debug.exe 安装:dosbox :https://www.dosbox.com/ debu ...

  8. c语言代码练习13

    //打印九九乘法表#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int x = 0; int y = ...

  9. 浅谈关于LCA

    prologue 本身只会 tarjan 和 倍增法求LCA 的,但在发现有一种神奇的\(O(1)\) 查询 lca 的方法,时间优化很明显. main body 倍增法 先讨论倍增法,倍增法求 lc ...

  10. CSS 多行文本超链接下划线动效

    先看效果 乍一看,是不是感觉很简单,仔细一瞅发现事情好像没有那么简单. 如果十分钟还没想出怎么实现,那就把简历上的"精通css"改成"了解css"-- 大部分人 ...