Python 3.x 使用pyTorch张量沿一个特定维度与三维张量建立索引

Python 3.x 使用pyTorch张量沿一个特定维度与三维张量建立索引,python-3.x,numpy,indexing,pytorch,torch,Python 3.x,Numpy,Indexing,Pytorch,Torch,我有两个张量: 带形状的A(批次、序列、B) B带形状(批次、顺序) 我想得到以下信息: C = torch.zeros_like(B) for i in range(B.shape[0]): for j in range(B.shape[1]): C[i,j] = A[i,j,B[i,j]] 但是以矢量化的方式。我试过火炬,收集和其他东西,但我不能让它工作。 有人能帮我吗?>>进口火炬 >>>A=火炬张量([[1,2,3.]), ... [ 5., 6., 7

我有两个张量:

带形状的A(批次、序列、B) B带形状(批次、顺序)

我想得到以下信息:

C = torch.zeros_like(B)
for i in range(B.shape[0]):
   for j in range(B.shape[1]):
      C[i,j] = A[i,j,B[i,j]]
但是以矢量化的方式。我试过火炬,收集和其他东西,但我不能让它工作。 有人能帮我吗?

>>进口火炬
>>>A=火炬张量([[1,2,3.]),
...      [ 5.,  6.,  7.]],
... 
...     [[ 9., 10., 11.],
...      [13., 14., 15.]]])
>>>B=火炬张量([[0,2],
...     [1, 0]])
>>>A.形状
火炬尺寸([2,2,3])
>>>B.形状
火炬尺寸([2,2])
>>>C=火炬。类似于零(B)
>>>对于范围内的i(B.形状[0]):
...    对于范围内的j(B.形状[1]):
...       C[i,j]=A[i,j,B[i,j]]
... 
>>>C
张量([[1,7],
[10, 13]])
>>>火炬聚集(A,-1,B.unsqueze(-1))
张量([[1.],
[ 7.]],
[[10.],
[13.]]])
>>>火炬。聚集(A,-1,B。未聚集(-1))。形状
火炬尺寸([2,2,1])
>>>火炬。聚集(A,-1,B。未挤压(-1))。挤压(-1)
张量([[1,7.],
[10., 13.]])
您好,您可以使用
火炬。聚集(A,-1,B.unsqueze(-1))。挤压(-1)
。 在
A
B之间的第一个
-1
表示要沿着哪个维度拾取图元

B.unsqueze(-1)中的第二个
-1
是向B添加一个dim,使两个张量具有相同的dim,否则会得到
运行时错误:索引张量必须具有与输入张量相同的维数


最后一个
-1
是将结果从
torch.Size([2,2,1])
重塑为
torch.Size([2,2])

非常感谢。这很有帮助:)
C = torch.zeros_like(B)
for i in range(B.shape[0]):
   for j in range(B.shape[1]):
      C[i,j] = A[i,j,B[i,j]]