如何从一个内容张量和另一个索引构建张量?
How to build a tensor from one tensor of contents and another of indices?
我正在尝试 assemble 基于其他两个张量的内容的张量,如下所示:
我有一个名为 A 的二维张量,形状为 I * J,还有另一个名为 B 的二维张量,形状为 M * N,其元素是 A 的第一维的索引。
我想获得一个形状为 M * N * J 的 3D 张量 C,使得 [0, M) 中的所有 m 和 [0, N) 中的 n) 的 C[m,n,:] == A[B[m,n],:]
。
我可以使用嵌套for循环迭代M和N中的所有索引,在每个索引处为C分配正确的值,但M和N很大所以这很慢。我怀疑有一些更好、更快的方法可以使用巧妙的切片或内置的 pytorch 函数来执行此操作,但我不知道它会是什么。它看起来有点像在某个地方使用 torch.gather(),但这需要所有张量具有相同的维数。有谁知道应该怎么做?
编辑:torch.index_select(input, dim, index)
几乎是我想要的,但它在这里不起作用,因为它要求 index
是一维张量,而我的索引张量是二维的。
您可以通过展平第一个维度来实现这一点,让您索引 A
。恢复最终形状需要广播
>>> A[B.flatten(),:].reshape(*B.shape, A.size(-1))
索引 A[B.flatten(),:]
等同于 torch.index_select(A, 0, B.flatten())
.
我正在尝试 assemble 基于其他两个张量的内容的张量,如下所示:
我有一个名为 A 的二维张量,形状为 I * J,还有另一个名为 B 的二维张量,形状为 M * N,其元素是 A 的第一维的索引。
我想获得一个形状为 M * N * J 的 3D 张量 C,使得 [0, M) 中的所有 m 和 [0, N) 中的 n) 的 C[m,n,:] == A[B[m,n],:]
。
我可以使用嵌套for循环迭代M和N中的所有索引,在每个索引处为C分配正确的值,但M和N很大所以这很慢。我怀疑有一些更好、更快的方法可以使用巧妙的切片或内置的 pytorch 函数来执行此操作,但我不知道它会是什么。它看起来有点像在某个地方使用 torch.gather(),但这需要所有张量具有相同的维数。有谁知道应该怎么做?
编辑:torch.index_select(input, dim, index)
几乎是我想要的,但它在这里不起作用,因为它要求 index
是一维张量,而我的索引张量是二维的。
您可以通过展平第一个维度来实现这一点,让您索引 A
。恢复最终形状需要广播
>>> A[B.flatten(),:].reshape(*B.shape, A.size(-1))
索引 A[B.flatten(),:]
等同于 torch.index_select(A, 0, B.flatten())
.