如何利用张量的稀疏性?

问题描述 投票:0回答:1

对于包含大量零的密集矩阵,

scipy.sparse
实现稀疏矩阵来有效地存储和操作它。

但是如果张量(高于二维)是稀疏的,我们也可以利用稀疏性,是否有包可以有效地实现存储和收缩操作?或者有相关论文研究吗? 预先感谢!

sparse-matrix tensor
1个回答
0
投票

pypi
中至少有一个包旨在扩展
scipy.sparse
以处理更多维度。
scipy.sparse
本身正在尝试切换到
arrays
,这将与
numpy.ndarray
更兼容,尽管到目前为止的变化只是名义上的。
scipy.sparse
仍然是 2d,(某种程度上)以
np.matrix
子类为模型。

稀疏数学最适合线性系统,例如有限元和有限差分建模。因此,像矩阵乘法和各种线性方程求解器这样的数学最受关注。

scipy.sparse
中,COO格式是矩阵创建的首选。理论上,扩展它以处理更多维度很容易,只需添加更多索引数组即可。 DOK 格式也应该易于扩展,因为它是带有元组键的
dict

但是 COO 不实现索引或数学。即使转换为密集数组以进行显示,也需要转换为 CSR。

CSR(和 CSC)是实现大多数数学以及索引的地方。为此,COO 值必须按行排序,并对重复坐标进行求和(这主要是为了创建具有重叠节点的 FEA 样式刚度矩阵)。

然后,COO 行数组被替换为每行一个值(加 1)的

indptr

 数组。将这种 CSR(压缩行)格式扩展到 3d+ 不太明显。

使用 CSR 格式进行矩阵乘法的数学已经非常成熟。

按元素进行数学运算,例如

sin

、平方等,只需对
numpy
数组应用相应的
data
运算即可。它不会改变 
sparsity
,即那些非零项的坐标。

更改 CSR 矩阵的稀疏性被认为是昂贵的,并且会发出警告。

LIL 格式的开发是为了使迭代元素更改更容易。在 scipy 中,数据存储为对象 dtype 列表数组 - 每行一个列表。它实现了索引,并且还可以进行一些数学运算(?)。与 CSR 一样,向 3D 的扩展在概念上更困难。

至少在CSR格式中,索引实际上是通过矩阵乘法实现的。也就是说,它构造一个

extractor

 矩阵,以产生所需的结果。行和列的和也通过矩阵乘法实现。

因此,对于简单的数据存储,COO(或DOK)格式可以扩展到更多维度。但许多其他“操作”与二维矩阵 CSR 格式密切相关。

© www.soinside.com 2019 - 2024. All rights reserved.