Sparse
这在 numpy 和 scipy.sparse
的基础上实现了任意维度的稀疏数组。它推广了 scipy.sparse.coo_matrix
和 scipy.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 许可证。