🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 | 专栏介绍 |
《C语言》 | 本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
《网络协议》 | 本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
《docker容器精解篇》 | 全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
《linux系列》 | 本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
《python 系列》 | 本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
《试题库》 | 本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
⛳️ 推荐
专栏介绍
📌 为什么需要稀疏矩阵?
🔑 SciPy 稀疏矩阵的 3 种核心格式
🧪 代码示例(直接复制运行)
1️⃣ 创建稀疏矩阵(COO 格式)
2️⃣ 转换为 CSR 格式(用于高效计算)
3️⃣ 矩阵运算(CSR 优势)
4️⃣ 稀疏矩阵与 NumPy 混合操作
⚠️ 常见问题解决
❌ 问题 1:ValueError: shape must be a tuple of two integers
❌ 问题 2:稀疏矩阵无法直接用 np.dot
❌ 问题 3:内存占用仍高
💡 实用技巧
📚 学习路径推荐
以下是SciPy 稀疏矩阵的详细指南,涵盖核心概念、常用格式、操作示例及实用技巧。稀疏矩阵在处理大规模、低密度数据(如推荐系统、图像处理、图网络)时至关重要,可节省 90%+ 的内存并加速计算。
📌 为什么需要稀疏矩阵?
- 普通矩阵:存储所有元素(包括大量
0),内存消耗高。 - 稀疏矩阵:仅存储非零元素及其位置,大幅节省空间(例如
1000×1000矩阵中 99% 为 0 时,稀疏存储仅需约 1% 空间)。
🔑 SciPy 稀疏矩阵的 3 种核心格式
| 格式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| CSR | 矩阵乘法、行切片(A[i,:]) | 快速行访问、矩阵乘法高效 | 列切片慢(A[:,j]) |
| CSC | 列操作、列切片(A[:,j]) | 快速列访问、稀疏线性方程求解 | 行切片慢 |
| COO | 构建稀疏矩阵(动态添加元素) | 构建速度快、易于理解 | 不能直接用于计算 |
✅推荐实践:
- 构建时用
COO→ 转换为CSR/CSC用于计算(如csr_matrix)。
🧪 代码示例(直接复制运行)
1️⃣ 创建稀疏矩阵(COO 格式)
import numpy as np from scipy.sparse import coo_matrix # 创建一个 4x4 稀疏矩阵(非零元素:(0,1)=3, (1,0)=1, (2,2)=5) row = np.array([0, 1, 2]) col = np.array([1, 0, 2]) data = np.array([3, 1, 5]) # 用 COO 格式构建 sparse_coo = coo_matrix((data, (row, col)), shape=(4, 4)) print("COO 格式:\n", sparse_coo.toarray()) # 转为稠密数组查看输出:
COO 格式: [[0 3 0 0] [1 0 0 0] [0 0 5 0] [0 0 0 0]]2️⃣ 转换为 CSR 格式(用于高效计算)
sparse_csr = sparse_coo.tocsr() # 转换为 CSR print("CSR 格式 (数据存储):", sparse_csr.data) # 非零元素 print("CSR 格式 (行索引):", sparse_csr.indices) # 列索引 print("CSR 格式 (行指针):", sparse_csr.indptr) # 行起始位置输出:
CSR 格式 (数据存储): [3 1 5] CSR 格式 (行索引): [1 0 2] CSR 格式 (行指针): [0 1 2 3 4]3️⃣ 矩阵运算(CSR 优势)
# 两个 CSR 矩阵相乘 A = sparse_csr B = sparse_csr # 计算 A * B (高效!) C = A.dot(B) print("A * B (CSR):\n", C.toarray())4️⃣ 稀疏矩阵与 NumPy 混合操作
# 将稀疏矩阵转为稠密数组(仅当矩阵小到可存时使用!) dense_A = A.toarray() # 与普通数组运算(例如:稀疏矩阵 + 标量) result = A + 2 # 每个非零元素 +2 print("A + 2:\n", result.toarray())⚠️ 常见问题解决
❌ 问题 1:ValueError: shape must be a tuple of two integers
原因:shape参数未指定或格式错误
解决:确保shape=(rows, cols)为元组
# 正确 sparse = coo_matrix((data, (row, col)), shape=(3, 3))❌ 问题 2:稀疏矩阵无法直接用np.dot
原因:稀疏矩阵是scipy.sparse对象,不兼容 NumPy 的dot
解决:使用.dot()或@运算符:
# 正确 result = A.dot(B) # 或 A @ B❌ 问题 3:内存占用仍高
原因:误用toarray()转为稠密矩阵(仅在必要时使用!)
解决:避免toarray(),始终用稀疏操作:
# 错误(内存爆炸!) dense = A.toarray() * 1000 # 正确(保持稀疏) sparse_result = A * 1000 # 1000 是标量,自动优化💡 实用技巧
从文件加载稀疏矩阵(如
.mtx格式):from scipy.io import mmread sparse_matrix = mmread("data.mtx") # 读取 Matrix Market 格式检查是否稀疏:
print("是否稀疏:", isinstance(sparse_csr, scipy.sparse.csr_matrix))稀疏矩阵的统计:
print("非零元素数:", sparse_csr.nnz) # non-zero count print("密度:", sparse_csr.nnz / (sparse_csr.shape[0] * sparse_csr.shape[1]))与机器学习库集成(Scikit-learn):
from sklearn.feature_extraction.text import TfidfVectorizer # 文本向量化自动输出 CSR 矩阵 vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(["text data", "another text"])
📚 学习路径推荐
- 官方文档:SciPy Sparse Matrix Tutorial
- 实战案例:
- 推荐系统中的稀疏矩阵
- 图网络(Graph) 的邻接矩阵表示
✨关键总结:
稀疏矩阵 ≠ 稠密矩阵→ 用csr_matrix/csc_matrix代替np.array,避免toarray(),用.dot()代替np.dot。
90% 的稀疏矩阵问题都源于错误的格式选择或误用稠密操作。
安装 SciPy 后,只需from scipy.sparse import csr_matrix即可开始使用。如果需要具体场景的代码(如图像处理、NLP),欢迎提供细节,我会给出针对性示例! 🚀
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙