2015-04-25 138 views
6

我正在开发一个项目,我需要处理3维大阵列。我使用的是numpy 3D数组,但我的大多数条目将为零,因此会造成大量内存浪费。 Scipy稀疏似乎只允许2D矩阵。有没有其他方式可以存储3D稀疏数组?Python多维稀疏阵列

回答

1

你是对的;它看起来并不像是用于处理n维稀疏数组的工具。如果你只需要访问数组中的元素,那么有些选项使用键入元组的字典。请参阅:

sparse 3d matrix/array in Python?

如果您需要做的三维稀疏矩阵运算,它得到harder-你可能需要做一些编码自己。

+0

我不想使用字典,因为我需要对数组执行矢量化操作。我不知道他们是否会快速使用字典? – Naman

+0

添加一些你想要的问题向量操作的例子。这可能表明哪种稀疏格式最好,以及它是否可以适应。 – hpaulj

4

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

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

但是csrcsc存储在indicesindptrdata阵列的阵列。这种格式多年前由数学家研究线性代数问题以及高效的数学运算(尤其是矩阵乘法)。 (相关论文在源代码中被引用)。

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

你真的需要3D布局来做矢量操作吗?例如,您是否可以至少暂时将两个维度重塑为1?

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

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

总体而言,我认为从重新定型数组中获得更多的速度,而不是尝试寻找/实现真正的3D稀疏操作。