跳到内容

Sparse

这在 numpyscipy.sparse 的基础上实现了任意维度的稀疏数组。它推广了 scipy.sparse.coo_matrixscipy.sparse.dok_matrix 布局,但其维度扩展到任意数量,而不仅仅是行和列。

此外,该项目保持与 numpy.ndarray 接口的兼容性,而不是 numpy.matrix 接口,后者在 scipy.sparse 中使用。

这些差异使得该项目在某些不适合使用 scipy.sparse 矩阵的情况下非常有用,但它不应被视为完全替代品。pydata/sparse 中的数据结构可以补充并与 scipy.sparse 内部的快速线性代数例程结合使用。可能需要进行格式转换或复制。

动机

稀疏数组,即大部分为空或填充零的数组,在许多科学应用中很常见。为了节省空间,我们通常避免以传统的密集格式存储这些数组,而是选择不同的数据结构。我们选择的数据结构会显著影响处理这些数组时的存储和计算成本。

设计

该库中的主要数据结构遵循稀疏矩阵的 坐标列表 (COO) 布局,但将其扩展到多维度。

COO 布局存储每个元素的行索引、列索引和值

数据
0 0 10
0 2 13
1 3 9
3 8 21

将 COO 布局扩展到任意数量的维度是直截了当的

维度1 维度2 维度3 ... 数据
0 0 0 . 10
0 0 3 . 13
0 2 2 . 9
3 1 4 . 21

这使得存储多维稀疏数组变得容易,但我们仍然需要重新实现所有的数组操作,例如转置、重塑、切片、张量点积、降维等,这通常具有挑战性。

该库还包含其他几种数据结构。与 COO 类似,稀疏矩阵的 键值字典 (DOK) 格式很好地推广到任意数量的维度。DOK 非常适合写入和修改。大多数其他操作不支持 DOK。常见的工作流程可能包括使用 DOK 写入数组,然后转换为其他格式以进行其他操作。

压缩稀疏行/列 (CSR/CSC) 格式在科学计算中广泛使用,现在 pydata/sparse 也支持这些格式。CSR/CSC 格式在压缩和数学运算方面表现出色。虽然这些格式仅限于二维,但 pydata/sparse 支持 GCXS 稀疏数组格式,该格式基于 GCRS/GCCS,将 CSR/CSC 推广到 n 维数组。与它们的二维 CSR/CSC 对应物一样,GCXS 数组压缩效果良好。COO 的存储成本严重依赖于数组的维度数量,而维度的数量对 GCXS 数组的存储成本影响极小,这使得在许多用例中都能获得有利的压缩比。

这些格式共同涵盖了稀疏性应用的广泛范围。此外,由于每种格式都符合 numpy.ndarray 接口并遵循适当的分派协议,pydata/sparse 数组可以与其他数组库交互,并无缝参与基于 pydata 生态系统的工作流程。

许可证

本库采用 BSD-3 许可证。