Python多维稀疏数组

时间:2015-04-25 22:57:35

标签: python scipy

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

2 个答案:

答案 0 :(得分:3)

scipy.sparse有许多格式,但只有一对格式有一组有效的数字操作。不幸的是,那些是更难扩展的。

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

csrcsc将数组存储在indicesindptrdata数组中。这种格式是几年前由数学家处理线性代数问题,以及有效的数学运算(esp矩阵乘法)。 (相关论文在源代码中引用)。

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

你真的需要3D布局来进行矢量运算吗?例如,你可以将2个维度重塑为1,至少是暂时的吗?

元素操作(*,+, - )与平面数组的数据一样,与2或3d版本一样。 np.tensordot通过将输入重新整形为2D数组并应用np.dot来处理nD矩阵乘法。即使在3d数组上使用np.einsum,产品求和通常也只是一对维度(例如'ijk,jl-> ikl')

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

总的来说,我认为通过重塑数组比从尝试查找/实现真正的3D稀疏操作中获得更快的速度。

答案 1 :(得分:2)

你是对的;它看起来没有用于处理n维稀疏数组的既定工具。如果您只需要访问数组中的元素,则可以使用键入元组的字典进行选项。参见:

sparse 3d matrix/array in Python?

如果你需要对稀疏的3d矩阵进行操作,那就更难了 - 你可能不得不自己做一些编码。