🎬 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:内存占用仍高

💡 实用技巧

📚 学习路径推荐


img

以下是 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 是标量,自动优化

💡 实用技巧

  1. 从文件加载稀疏矩阵(如 .mtx 格式):

    from scipy.io import mmread
    sparse_matrix = mmread("data.mtx")  # 读取 Matrix Market 格式
    
  2. 检查是否稀疏

    print("是否稀疏:", isinstance(sparse_csr, scipy.sparse.csr_matrix))
    
  3. 稀疏矩阵的统计

    print("非零元素数:", sparse_csr.nnz)  # non-zero count
    print("密度:", sparse_csr.nnz / (sparse_csr.shape[0] * sparse_csr.shape[1]))
    
  4. 与机器学习库集成(Scikit-learn):

    from sklearn.feature_extraction.text import TfidfVectorizer
    # 文本向量化自动输出 CSR 矩阵
    vectorizer = TfidfVectorizer()
    X = vectorizer.fit_transform(["text data", "another text"])
    

📚 学习路径推荐

  1. 官方文档SciPy Sparse Matrix Tutorial
  2. 实战案例

关键总结
稀疏矩阵 ≠ 稠密矩阵 → 用 csr_matrix/csc_matrix 代替 np.array避免 toarray(),用 .dot() 代替 np.dot
90% 的稀疏矩阵问题都源于错误的格式选择或误用稠密操作。


安装 SciPy 后,只需 from scipy.sparse import csr_matrix 即可开始使用。如果需要具体场景的代码(如图像处理、NLP),欢迎提供细节,我会给出针对性示例! 🚀

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐