我有一个表示稀疏 3-D 矩阵的压缩格式的张量。我需要将其转换为普通矩阵(它实际代表的矩阵)。因此,就我而言,矩阵的任何二维切片的每一行都只能包含一个非零元素。那么,作为数据,我对这些行中的每一行、值和它出现的索引都有。例如,张量
inp = torch.tensor([[ 1, 2],
[ 3, 4],
[-1, 0],
[45, 1]])
表示一个 4x5 矩阵(第一维来自张量的第一维,第二维来自元数据)A,其中A[0][2] = 1, A[1][4] = 3, A[2][0] = -1, A[3][1] = 45
.
这只是我的矩阵的一个二维切片,我有可变数量的这些。我能够使用 sparse_coo_tensor 以下列方式对上述二维切片执行此操作:
>>> torch.sparse_coo_tensor(torch.stack([torch.arange(0, 4), inp.t()[1]]), inp.t()[0], [4,5]).to_dense()
tensor([[ 0, 0, 1, 0, 0],
[ 0, 0, 0, 0, 3],
[-1, 0, 0, 0, 0],
[ 0, 45, 0, 0, 0]])
这是实现这一目标的最佳方法吗?有没有更简单、更易读的替代方案?如何在不循环的情况下将其扩展到 3-D 矩阵?对于 3-D 矩阵,您可以想象输入类似于
inp_list = torch.stack([inp, inp, inp, inp])
并且所需的输出将是上述输出堆叠 4 次。
我觉得如果我正确地创建了一个索引数组,我应该能够做一些事情,但是如果不使用某种循环,我想不出一种方法来做到这一点。