【发布时间】:2015-07-04 11:38:40
【问题描述】:
我正在处理一个需要处理 3 维大型数组的项目。我使用的是 numpy 3d 数组,但我的大部分条目都将为零,所以这会浪费很多内存。 Scipy sparse 似乎只允许二维矩阵。有没有其他方法可以存储 3D 稀疏数组?
【问题讨论】:
-
2022 年仍然不存在开箱即用的实现..
我正在处理一个需要处理 3 维大型数组的项目。我使用的是 numpy 3d 数组,但我的大部分条目都将为零,所以这会浪费很多内存。 Scipy sparse 似乎只允许二维矩阵。有没有其他方法可以存储 3D 稀疏数组?
【问题讨论】:
scipy.sparse 有多种格式,但只有几个有一组有效的数字运算。不幸的是,这些更难扩展。
dok 使用索引的元组作为字典键。所以这很容易从 2d 推广到 3d 或更多。 coo 具有 row、col、data 属性数组。从概念上讲,添加第三个depth(?) 很容易。 lil 可能需要列表中的列表,这可能会变得混乱。
但是csr 和csc 将数组存储在indices、indptr 和data 数组中。这种格式是几年前由处理线性代数问题的数学家以及高效的数学运算(尤其是矩阵乘法)制定的。 (相关论文在源代码中引用)。
因此表示 3d 稀疏数组不是问题,但实现有效的向量运算可能需要一些基础数学研究。
您真的需要 3d 布局来执行矢量操作吗?例如,您能否至少暂时将 2 个维度重塑为 1 个维度?
逐个元素的操作 (*,+,-) 与 2 或 3d 版本一样适用于扁平数组的数据。 np.tensordot 通过将输入重塑为二维数组并应用 np.dot 来处理 nD 矩阵乘法。即使np.einsum 用于 3d 数组,乘积和通常也只超过一对维度(例如 'ijk,jl->ikl')
3D 表示在概念上可能很方便,但我想不出需要它的数学运算(而不是 2 或 1d)。
总体而言,我认为与尝试查找/实施真正的 3d 稀疏运算相比,重塑数组的速度更快。
【讨论】:
你是对的;看起来没有用于处理 n 维稀疏数组的既定工具。如果您只需要访问数组中的元素,则可以使用以元组为键的字典的选项。见:
sparse 3d matrix/array in Python?
如果您需要对稀疏的 3d 矩阵进行操作,那就更难了——您可能必须自己进行一些编码。
【讨论】: