我正在开发一个需要处理三维大型数组的项目。我使用的是numpy 3d数组,但我的大多数条目都是零,所以这是很多内存的浪费。 Scipy稀疏似乎只允许2D矩阵。有没有其他方法可以存储3D稀疏数组?
答案 0 :(得分:3)
scipy.sparse
有许多格式,但只有一对格式有一组有效的数字操作。不幸的是,那些是更难扩展的。
dok
使用索引的元组作为字典键。因此,很容易从2d推广到3d或更多。 coo
有row
,col
,data
个属性数组。从概念上讲,添加第三个depth
(?)很容易。 lil
可能需要列表中的列表,这可能会变得混乱。
但csr
和csc
将数组存储在indices
,indptr
和data
数组中。这种格式是几年前由数学家处理线性代数问题,以及有效的数学运算(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矩阵进行操作,那就更难了 - 你可能不得不自己做一些编码。