Indexing 如何以GPU友好的方式获取2D张量中多个元素的索引?

Indexing 如何以GPU友好的方式获取2D张量中多个元素的索引?,indexing,pytorch,tensor,Indexing,Pytorch,Tensor,这个问题与已经回答的问题类似,但是这个问题没有涉及如何检索多个元素的索引 我有一个2D张量点,有许多行和少量列,我想得到一个包含该张量中所有元素行索引的张量。我事先知道点中存在哪些元素;它包含从0到999的整数元素,我可以使用range函数生成一个张量来反映可能的元素集。元素可以位于任何列中 如何检索每个元素出现在张量中的行索引,以避免循环或使用numpy,以便在GPU上快速执行此操作 我正在寻找类似于(points==elements)的东西。nonzero()[:,1] 谢谢 尝试torch

这个问题与已经回答的问题类似,但是这个问题没有涉及如何检索多个元素的索引

我有一个2D张量
,有许多行和少量列,我想得到一个包含该张量中所有元素行索引的张量。我事先知道
点中存在哪些元素;它包含从0到999的整数元素,我可以使用range函数生成一个张量来反映可能的元素集。元素可以位于任何列中

如何检索每个元素出现在张量中的行索引,以避免循环或使用numpy,以便在GPU上快速执行此操作

我正在寻找类似于
(points==elements)的东西。nonzero()[:,1]

谢谢

尝试
torch.cat([(t==i).nonzero()表示元素中的i\u to\u compare])

导入火炬 >>>t=火炬。空((15,4))。随机_0999 >>>t 张量([[429,833,393,828.], [555., 893., 846., 909.], [ 11., 861., 586., 222.], [232., 92., 576., 452.], [171., 341., 851., 953.], [ 94., 46., 130., 413.], [243., 251., 545., 331.], [620., 29., 194., 176.], [303., 905., 771., 149.], [482., 225., 7., 315.], [ 44., 547., 206., 299.], [695., 7., 645., 385.], [225., 898., 677., 693.], [746., 21., 505., 875.], [591., 254., 84., 888.]])
Numpy

>>> np.nonzero(np.isin(t, [7,385]))
(array([ 9, 11, 11], dtype=int64), array([2, 1, 3], dtype=int64))

>>> np.nonzero(np.isin(t, [7,385]))[1]
array([2, 1, 3], dtype=int64)

尝试
torch.cat([(t==i).nonzero()表示元素中的i\u to\u compare])

导入火炬 >>>t=火炬。空((15,4))。随机_0999 >>>t 张量([[429,833,393,828.], [555., 893., 846., 909.], [ 11., 861., 586., 222.], [232., 92., 576., 452.], [171., 341., 851., 953.], [ 94., 46., 130., 413.], [243., 251., 545., 331.], [620., 29., 194., 176.], [303., 905., 771., 149.], [482., 225., 7., 315.], [ 44., 547., 206., 299.], [695., 7., 645., 385.], [225., 898., 677., 693.], [746., 21., 505., 875.], [591., 254., 84., 888.]]) Numpy

>>> np.nonzero(np.isin(t, [7,385]))
(array([ 9, 11, 11], dtype=int64), array([2, 1, 3], dtype=int64))

>>> np.nonzero(np.isin(t, [7,385]))[1]
array([2, 1, 3], dtype=int64)


我不确定我是否正确理解了您要查找的内容,但如果您想要某个值的索引,可以尝试使用
where
和结果的稀疏表示

例如,在下面的张量
点中
998
出现在索引
[0,0]
[2,0]
中。要获得这些指数,可以:

In [34]: points=torch.tensor([ [998,  6], [1, 3], [998, 999], [2, 3] ] )

In [35]: torch.where(points==998, points, torch.tensor(0)).to_sparse().indices()
Out[35]:
tensor([[0, 2],
        [0, 0]])

我不确定我是否正确理解了您要查找的内容,但如果您想要某个值的索引,可以尝试使用
where
和结果的稀疏表示

例如,在下面的张量
点中
998
出现在索引
[0,0]
[2,0]
中。要获得这些指数,可以:

In [34]: points=torch.tensor([ [998,  6], [1, 3], [998, 999], [2, 3] ] )

In [35]: torch.where(points==998, points, torch.tensor(0)).to_sparse().indices()
Out[35]:
tensor([[0, 2],
        [0, 0]])