Python多维稀疏数组

Nam*_*man 11 python scipy

我正在开发一个需要处理三维大阵列的项目.我使用的是numpy 3d数组,但我的大多数条目都是零,所以这是很多内存的浪费.Scipy稀疏似乎只允许2D矩阵.有没有其他方法可以存储3D稀疏数组?

hpa*_*ulj 6

scipy.sparse有多种格式,但只有少数有一组有效的数字运算。不幸的是,这些是更难扩展的。

dok使用索引的元组作为字典键。所以这很容易从 2d 推广到 3d 或更多。 coorow, col,data属性数组。从概念上讲,添加第三个depth(?) 很容易。 lil可能需要列表中的列表,这可能会变得混乱。

但是csrandcsc将数组存储在indices,indptrdata数组中。这种格式是多年前由数学家解决线性代数问题以及有效的数学运算(特别是矩阵乘法)制定的。(源代码中引用了相关论文)。

因此表示 3d 稀疏数组不是问题,但实现高效的向量运算可能需要一些基础数学研究。

您真的需要 3d 布局来进行矢量操作吗?例如,您能否至少暂时将 2 个维度重塑为 1 个维度?

逐元素操作 (*,+,-) 处理扁平数组的数据与处理 2 或 3d 版本的数据一样好。 np.tensordot通过将输入重新整形为二维数组,并应用np.dot. 即使np.einsum在 3d 数组上使用时,乘积总和通常只超过一对维度(例如 'ijk,jl->ikl')

3D 表示在概念上可能很方便,但我想不出需要它的数学运算(而不是 2 或 1d)。

总的来说,我认为与尝试查找/实现真正的 3d 稀疏操作相比,重构数组会获得更快的速度。


che*_*yle 3

你说得对; 看起来没有现成的工具可以处理 n 维稀疏数组。如果您只需要访问数组中的元素,可以选择使用以元组为键的字典。看:

Python 中的稀疏 3d 矩阵/数组?

如果您需要对稀疏 3d 矩阵进行运算,则会变得更加困难 - 您可能必须自己进行一些编码。