如何从给定的索引和值列表创建一维稀疏张量?

Posted

技术标签:

【中文标题】如何从给定的索引和值列表创建一维稀疏张量?【英文标题】:How to create a 1D sparse tensors from given list of indices and values? 【发布时间】:2020-07-24 15:01:06 【问题描述】:

我有一个索引和值的列表。我想从这个索引和值创建一个大小为 30000 的稀疏张量,如下所示。

indices = torch.LongTensor([1,3,4,6])
values = torch.FloatTensor([1,1,1,1])

所以,我想构建一个 30k 维稀疏张量,其中索引 [1,3,4,6] 为 1,其余为 0。我该怎么做?

我想高效地存储这些稀疏张量的序列。

【问题讨论】:

【参考方案1】:

In general indices 张量需要具有(sparse_dim, nnz) 的形状,其中nnz 是非零条目的数量,sparse_dim 是稀疏张量的维数。

在你的情况下nnz = 4sparse_dim = 1 因为你想要的张量是一维的。为了使您的索引正常工作,我们需要做的就是在 indices 的前面插入一个单一维度以使其形状为 (1, 4)

t = torch.sparse_coo_tensor(indices.unsqueeze(0), values, (30000,))

或等效

t = torch.sparse.FloatTensor(indices.unsqueeze(0), values, (30000,))

请记住,稀疏张量仅支持 limited number of operations。要将张量转换回它的密集(低效)表示,您可以使用to_dense 方法

t_dense = t.to_dense()

【讨论】:

以上是关于如何从给定的索引和值列表创建一维稀疏张量?的主要内容,如果未能解决你的问题,请参考以下文章

使用 str 键和 pytorch 张量列表将字典保存为值

在链表中递归插入节点,给定位置和值

如何使用 TensorFlow 张量索引列表?

交错稀疏排序数组

在 Torch 中,如何从整数标签列表中创建 1-hot 张量?

Racket Lang - Scheme如何组合环境的变量和值列表