如何在Python中读取MMF格式稀疏矩阵并执行线性代数运算
Python读取MMF稀疏矩阵并执行线性代数运算方案
前置依赖安装
需要用到scipy(负责读取MMF文件、稀疏矩阵运算)和numpy(基础数值计算),安装命令:pip install scipy numpy
读取MMF格式文件
你提供的是标准Matrix Market(MMF)的坐标式稀疏矩阵存储格式,默认行、列采用1索引,直接用scipy内置接口即可读取:
from scipy.io import mmread import numpy as np from scipy.sparse import csr_matrix # 读取MMF文件,默认返回COO格式稀疏矩阵 sparse_coo = mmread("你的文件路径.mtx") # 转换为CSR格式,更适合后续线性代数运算(插入少、读取/运算多的场景) sparse_csr = csr_matrix(sparse_coo) # 可选:如果需要转为稠密矩阵(6500阶完全可以承受,内存占用约320MB) dense_matrix = sparse_csr.toarray()
如果你的文件是没有MMF标准头的纯三列数据文本,可以手动读取构造稀疏矩阵:
# 读取三列数据:行索引、列索引、数值 data = np.loadtxt("你的文件路径.txt") rows = data[:, 0].astype(int) - 1 # 转为Python常用的0索引 cols = data[:, 1].astype(int) - 1 values = data[:, 2] # 构造COO稀疏矩阵 sparse_coo = csr_matrix((values, (rows, cols))) sparse_csr = sparse_coo.tocsr()
常见线性代数运算示例
直接基于scipy的稀疏矩阵接口即可完成运算,6500阶的矩阵运算效率很高:
- 矩阵乘向量
# 生成随机向量,长度等于矩阵列数 vec = np.random.rand(sparse_csr.shape[1]) result = sparse_csr.dot(vec)
- 矩阵乘矩阵
# 生成随机矩阵,维度匹配 another_mat = np.random.rand(sparse_csr.shape[1], 100) result_mat = sparse_csr.dot(another_mat)
- 解线性方程组Ax=b
from scipy.sparse.linalg import spsolve b = np.random.rand(sparse_csr.shape[0]) x = spsolve(sparse_csr, b)
- 求矩阵特征值
from scipy.sparse.linalg import eigs # 求模最大的前5个特征值和特征向量 eigenvalues, eigenvectors = eigs(sparse_csr, k=5)
注意事项
- 稀疏矩阵不建议直接调用
.todense()求逆,6500阶的稠密逆矩阵内存占用可控但运算效率低,如需逆矩阵相关运算优先用scipy.sparse.linalg下的专用接口。 - 如果矩阵是对称/厄米特/正定的,可以传入对应参数到线性代数接口中,运算速度会提升数倍。
内容的提问来源于stack exchange,提问作者Md Salem
相关产品推荐
相关产品推荐

