只存储非零的部分
许多大矩阵几乎全是零。期权定价的网格每个价格水平一行,每一行只与两个相邻行有关。这样的矩阵叫稀疏矩阵。把每个零都存下来既浪费内存又浪费时间。scipy.sparse 只保存非零元素。csr_matrix(压缩稀疏行)格式用三个列表:data 按行存放非零值,indices 存每个值的列号,indptr 说明每一行在 data 中的起止位置:第 行是 data[indptr[i]:indptr[i+1]]。indptr 的最后一个数就是非零个数 nnz。
不同格式适合不同任务。coo_matrix 直接存(行, 列, 值)三元组,是最容易构造矩阵的方式。csr_matrix 对行切片和乘积 很快,乘积大约只需 nnz 次乘法而不是 次。csc_matrix 是按列的同样思路,dia_matrix 存对角线,最适合带状矩阵。对方程组 ,sparse.linalg.spsolve 利用零元素,比稠密求解快得多。稀疏并不总是更好:若非零元素超过约三分之一,管理开销就超过了节省。在金融中,稀疏性出现在定价网格、大多数载荷为零的因子模型,以及只保留强相关的场合。
data=[5,1,2,3,4],indices=[0,3,2,0,3],indptr=[0,2,3,3,5]。第 行为空,因为 indptr[2]=indptr[3]=3,且 nnz=5。乘以 就是各行求和,得 ,只需 次乘法。像有限差分定价网格那样的 三对角矩阵,在 个元素中有 个非零,密度 。CSR 约需 KB,而稠密存储需 MB。在真实数据上,共享价格文件中 只股票的相关系数构成 矩阵。只保留 的元素,则在 个中留下 个,占 ,CSR 副本占 KB,稠密为 KB。取 时只剩 。- 三个列表:
data、indices、indptr描述 CSR 矩阵,indptr[-1]是非零个数。 - 用 COO 构建,用 CSR 计算:三元组便于组装,按行存储适合乘积和求解。
- 只有大部分为零时稀疏才划算:非零元素很多时,稠密矩阵更好。
实验:评分内容
- 统计非零个数10 分
- 一行有多少个值10 分
- 网格的密度10 分
- 稀疏乘积15 分
- 哪种格式用于哪项任务15 分
- 三对角方程组10 分
- 稀疏何时划算,何时不划算30 分