【scipy 基础】--稀疏矩阵
稀疏矩阵是一种特殊的矩阵,其非零元素数目远远少于零元素数目,并且非零元素分布没有规律。
这种矩阵在实际应用中经常出现,例如在物理学、图形学和网络通信等领域。
稀疏矩阵其实也可以和一般的矩阵一样处理,之所以要把它区分开来进行特殊处理,是因为:
一方面稀疏矩阵的存储空间开销通常比稠密矩阵要小得多,可以节省存储空间;
另一方面,在计算稀疏矩阵时,可以利用其特殊的结构,采用专门的算法,提高计算效率和准确性。
因此,稀疏矩阵在Scipy
库中被单独作为一个模块,以便被更好地处理和应用。
1. 主要功能
稀疏矩阵子模块(scipy.sparse
)的主要功能包括:
类别 | 说明 |
---|---|
稀疏数组类 | 支持各种格式的稀疏数组 |
稀疏矩阵类 | 支持各种格式的稀疏矩阵 |
稀疏矩阵工具 | 构建,保存,加载以及识别稀疏矩阵的各种函数 |
其他 | 包含压缩稀疏图例程,稀疏线性代数等子模块,以及一些异常处理方法 |
这里有个需要注意的地方是稀疏数组和稀疏矩阵的区别。
这两个类别中的很多函数名称也类似,比如:bsr_array
和bsr_matrix
,coo_array
和coo_matrix
等等。
只要区别在于:***_matrix
类的函数是一种基于Compressed Sparse Row(CSR)和Compressed Sparse Column(CSC)格式的块稀疏矩阵表示方法。
它使用一个字典来存储非零元素,其中每个元素对应于一个包含三个值的元组,分别表示该元素的行索引、列索引和非零元素的值。
这种数据结构可以提供更好的计算性能和内存使用效率,特别适合于大规模的块稀疏矩阵计算。
而***_array
类的函数虽然类似于***_matrix
的数据结构,但它允许更大的灵活性。***_array
可以表示任意的稀疏数组,而不仅仅是块稀疏矩阵。
它使用一个具有三个数组的元组来表示稀疏数组,其中第一个数组存储行索引,第二个数组存储列索引,第三个数组存储非零元素的值。
这种数据结构适用于更通用的稀疏数组计算,但可能不如***_matrix
高效。
总之,***_matrix
和***_array
都是用于表示块稀疏矩阵或稀疏数组的数据结构。***_matrix
更适合于大规模的块稀疏矩阵计算,而***_array
适用于更通用的稀疏数组计算。
2. 使用示例
稀疏矩阵之所以成为单独的一个模块,是因为它的稀疏的特性在很多领域多有广泛的应用。scipy.sparse
子模块中提供了大概7种:
- csc_matrix: 压缩稀疏列格式(Compressed Sparse Column)
- csr_matrix: 压缩稀疏行格式(Compressed Sparse Row)
- bsr_matrix: 块稀疏行格式(Block Sparse Row)
- lil_matrix: 列表格式的列表(List of Lists format)
- dok_matrix: 键格式字典(Dictionary of Keys)
- coo_matrix: 坐标格式(又名 IJV,三元组格式)
- 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 基础】--稀疏矩阵的更多相关文章
- SciPy 基础功能
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- scipy构建稀疏矩阵
from scipy.sparse import csr_matrix import numpy as np indptr = np.array([0, 2, 3, 6]) indices = np. ...
- scipy.sparse 稀疏矩阵
from 博客园(华夏35度)http://www.cnblogs.com/zhangchaoyang 作者:Orisun 本文主要围绕scipy中的稀疏矩阵展开,也会介绍几种scipy之外的稀疏矩阵 ...
- Python教程:进击机器学习(五)--Scipy《转》
Scipy简介 文件输入和输出scipyio 线性代数操作scipylinalg 快速傅里叶变换scipyfftpack 优化器scipyoptimize 统计工具scipystats Scipy简介 ...
- SciPy 介绍
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- 1.5 Scipy:高级科学计算
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...
- python-数据处理的包Numpy,scipy,pandas,matplotlib
一,NumPy包(numeric python,数值计算) 该包主要包含了存储单一数据类型的ndarry对象的多维数组和处理数组能力的函数ufunc对象.是其它包数据类型的基础.只能处理简单的数据分析 ...
- 统计学习方法 | 第1章 统计学习方法概论 | Scipy中的Leastsq()
Scipy是一个用于数学.科学.工程领域的常用软件包,可以处理插值.积分.优化.图像处理.常微分方程数值解的求解.信号处理等问题.它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解 ...
- SciPy 信号处理
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 统计
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
随机推荐
- RobotFrameWork环境搭建及使用
RF环境搭建 首先安装python并且配置python环境变量 pip install robotframework pip install robotframework-ride 生产桌面快捷方式 ...
- 来会会babel这个重要且神奇的工具
babel 在前端工程化开发中发挥着至关重要的作用,它能将较高级的语法转成浏览器可识别的代码,无论中 es6 中 const .promise 还是 React.TypeScript. 以下babel ...
- 发布关于PostGIS对于USD格式的拓展
我们非常高兴的发布为了一年一度的SIGGRAPH 2023发布关于为PostGIS支持USD格式的新拓展. 新添加了3个函数 ST_AsUSDA(geom geometry, usd_root_nam ...
- LeetCode 周赛上分之旅 # 37 多源 BFS 与连通性问题
️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...
- Typora 主题,设置代码块Mac风格三个小圆点
目录 打造Typora主题 1 typoa样式修改步骤 1.1 第一步打开偏好设置 1.2 第二步打开主题文件夹 2 标题添加颜色 3 表格优化 4 代码块Mac风格三个圆点 5 主题总代码如下: 打 ...
- AI绘画| 迪士尼风格|可爱头像【附Midjourney提示词】
Midjourney案例分享 图片预览 迪士尼风格|可爱头像 高清原图及关键词Prompt已经放在文末网盘,需要的自取 在数字艺术的新时代,人工智能绘画已经迅速崭露头角.作为最先进的技术之一,AI绘画 ...
- MapReduce核心概念及架构
MapReduce简介 MapReduce常用于对大规模数据集(大于1TB)的并行运算,或对大数据进行加工.挖掘和优化等处理. MapReduce将并行计算过程高度抽象到了两个函数map和reduce ...
- 聊一聊 TLS/SSL
哈喽大家好,我是咸鱼 当我们在上网冲浪的时候,会在浏览器界面顶部看到一个小锁标志,或者网址以 "https://" 开头 这意味着我们正在使用 TLS/SSL 协议进行安全通信.虽 ...
- 20个最佳实践提升Terraform工作流程|Part 2
在上一部分,我们一同探讨了构建 Terraform 项目的一些策略,以及使用 Terraform 管理 IaC 的部分最佳实践.今天,我们将继续深入研究将 Terraform 代码提升到新水平的具体要 ...
- 千呼万唤始出来 JDK 21 LTS, 久等了
平地起惊雷!!! 目录 英雄的迟暮 大人时代变了 JDK 21 LTS 前 JAVA并发编程模型 JDK 21 LTS 中的 JAVA 并发编程模型 虚拟线程 VS 线程池 The Last 你可以称 ...