Pytorch 在二维张量中寻找匹配行的索引

Pytorch 在二维张量中寻找匹配行的索引,pytorch,tensor,Pytorch,Tensor,我有两个二维张量,长度不同,都是相同原始二维张量的不同子集,我想找到所有匹配的行 e、 g 我只见过numpy解决方案,它使用dtype作为dict,不适用于Pytork 下面是我在numpy的做法 这个答案是在OP用其他限制更新问题之前发布的,这些限制大大改变了问题 TL;博士,你可以这样做: torch.where==B.alldim=1[0] 首先,假设您有: 进口火炬 A=火炬张量[[1,2,3],[4,5,6],[7,8,9]] B=火炬张量[[1,2,3],[4,4,4],[7,8

我有两个二维张量,长度不同,都是相同原始二维张量的不同子集,我想找到所有匹配的行 e、 g

我只见过numpy解决方案,它使用dtype作为dict,不适用于Pytork

下面是我在numpy的做法


这个答案是在OP用其他限制更新问题之前发布的,这些限制大大改变了问题

TL;博士,你可以这样做:

torch.where==B.alldim=1[0] 首先,假设您有:

进口火炬 A=火炬张量[[1,2,3],[4,5,6],[7,8,9]] B=火炬张量[[1,2,3],[4,4,4],[7,8,9]] 我们可以检查A==B是否返回:

所以,我们想要的是:它们都为真的行。为此,我们可以使用.all操作并指定感兴趣的维度,在我们的示例1中:

你真正想知道的是真相在哪里。为此,我们可以获得火炬的第一个输出。其中函数:

>>> torch.where((A == B).all(dim=1))[0]
tensor([0, 2])

如果A和B是2D张量,下面的代码查找索引,使A[索引]==B。如果多个索引满足此条件,则返回找到的第一个索引。如果A中不存在B的所有元素,则忽略相应的索引

values, indices = torch.topk(((A.t() == B.unsqueeze(-1)).all(dim=1)).int(), 1, 1)
indices = indices[values!=0]
# indices = tensor([0, 2])

你能给出一个想要的结果吗?我加了它,在张量a,B上,输出是索引0,2,因为它们在这些行中相交。非常感谢你,我的意思是它们可能有不同的长度,顺序也可能不同。@DsCpp哦,我明白了。那么这是一个完全不同的问题。发布您找到的NumPy解决方案。这将更容易理解您的所有限制。
>>> A == B
tensor([[ True,  True,  True],
        [ True, False, False],
        [ True,  True,  True]])
>>> (A == B).all(dim=1)
tensor([ True, False,  True])
>>> torch.where((A == B).all(dim=1))[0]
tensor([0, 2])
values, indices = torch.topk(((A.t() == B.unsqueeze(-1)).all(dim=1)).int(), 1, 1)
indices = indices[values!=0]
# indices = tensor([0, 2])