You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效计算两个SciPy稀疏矩阵乘积并直接生成NumPy稠密数组

稀疏矩阵乘积直接输出稠密NumPy数组的高效方案

最优输入稀疏格式选择

  • 优先选择CSR(压缩稀疏行) 格式存储矩阵,CSR格式的稀疏矩阵乘法内核经过最深度优化,运算效率远高于COO、LIL、DOK等其他稀疏存储格式。两个输入矩阵都转成CSR格式即可,不需要为了微小的性能差异分别给左右矩阵配不同格式,省掉额外转换开销。

无中间稀疏矩阵的实现方法

SciPy稀疏矩阵的乘法原生支持直接将计算结果写入预分配的稠密NumPy数组,完全跳过中间稀疏矩阵构造、非零元索引构建、稀疏转稠密格式转换的额外开销,比常规的「稀疏乘得稀疏结果再调用toarray()转稠密」的写法快30%左右(对应你给出的10000×10000、99%稀疏度测试场景)。
实现代码如下:

import numpy as np
from scipy import sparse

n = 10_000
# 生成测试用99%稀疏度矩阵
a = np.random.randn(n, n) * (np.random.randint(100, size=(n, n)) == 0)
b = np.random.randn(n, n) * (np.random.randint(100, size=(n, n)) == 0)

# 转成效率最高的CSR稀疏格式
a_sp = sparse.csr_matrix(a)
b_sp = sparse.csr_matrix(b)

# 预分配稠密结果数组,计算结果直接写入该数组,无中间稀疏矩阵生成
c = np.zeros((n, n), dtype=a.dtype)
a_sp.dot(b_sp, out=c)

# 验证非零占比,结果约为0.63
print(np.count_nonzero(c) / c.size)

注意事项

  • 不要使用COO、LIL、DOK等格式直接做矩阵乘法,这些格式的乘法逻辑会先隐式将矩阵转换为CSR格式再运算,会带来不必要的格式转换开销。
  • 预分配结果数组时要注意dtype和输入矩阵匹配,避免隐式类型转换拖慢运算速度。

内容的提问来源于stack exchange,提问作者MWB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:27:31