3

Say I have a tensor A and a container of values vals. Is there a clean way of returning a Boolean tensor of the same shape as A with each element being whether that element of A is contained within vals? e.g:

A = torch.tensor([[1,2,3],
                  [4,5,6]])
vals = [1,5]
# Desired output
torch.tensor([[True,False,False],
              [False,True,False]])
iacob
  • 20,084
  • 6
  • 92
  • 119

4 Answers4

5

You can achieve this with a for loop:

sum(A==i for i in B).bool()
iacob
  • 20,084
  • 6
  • 92
  • 119
3

You can simply do like this:

result = A.apply_(lambda x: x in vals).bool()

Then result will contain this tensor:

tensor([[ True, False, False],
        [False,  True, False]])

Here I simply used a lambda function and the apply_ method that you can find in the official documentation.

iacob
  • 20,084
  • 6
  • 92
  • 119
Erosinho
  • 165
  • 6
2
[list(map(lambda x: x in vals, thelist)) for thelist in A]
iacob
  • 20,084
  • 6
  • 92
  • 119
Hussam
  • 488
  • 3
  • 15
2

Use torch.isin method is the most convinient way. It's simple as follows: torch.isin(A, vals)

huyfam
  • 51
  • 2