繁体   English   中英

Python 多维稀疏数组

[英]Python multi dimensional sparse array

我正在做一个需要处理 3 维大数组的项目。 我使用的是 numpy 3d 数组,但我的大部分条目都将为零,因此 memory 的大量浪费。Scipy 稀疏似乎只允许二维矩阵。 还有其他方法可以存储 3D 稀疏数组吗?

scipy.sparse具有多种格式,尽管只有一对格式具有一组有效的数字运算。 不幸的是,这些是很难扩展的。

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

但是csrcsc将数组存储在indicesindptrdata数组中。 这种格式是几年前由从事线性代数问题的数学家以及有效的数学运算(特别是矩阵乘法)设计的。 (相关论文在源代码中被引用)。

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

您是否真的需要3d布局来进行矢量操作? 例如,是否可以至少暂时将尺寸的2重塑为1?

逐元素运算(*,+,-)与2或3d版本的平面数组数据一样工作。 np.tensordot通过将输入重塑为2D数组并应用np.dot np.tensordot处理nD矩阵乘法。 即使在3d数组上使用np.einsum ,乘积求和通常也只在一对尺寸上(例如'ijk,jl-> ikl')

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

总的来说,我认为重塑数组比尝试查找/实现真正的3d稀疏运算要快得多。

你是对的; 看起来似乎没有成熟的工具可以处理n维稀疏数组。 如果您只需要访问数组中的元素,则可以使用在元组上键入字典的选项。 看到:

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

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

见python库: https://sparse.pydata.org/en/stable/construct.html

下面给出了二维示例 - 从上面提供的页面复制。 但是,它也适用于 2 个以上的维度。 我目前正在使用这个库处理可变数量的维度。 正如一个小提示:如果稀疏矩阵的维数超过 2,则无法转换为已知的 SciPy 稀疏矩阵。

import sparse

coords = [[0, 1, 2, 3, 4],

          [0, 1, 2, 3, 4]]

data = [10, 20, 30, 40, 50]

s = sparse.COO(coords, data, shape=(5, 5))

s.todense()
array([[10,  0,  0,  0,  0],
       [ 0, 20,  0,  0,  0],
       [ 0,  0, 30,  0,  0],
       [ 0,  0,  0, 40,  0],
       [ 0,  0,  0,  0, 50]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM