How to convert a pytorch tensor of ints to a tensor of booleans?
PyTorch's to(dtype)
method has convenient data-type named aliases. You can simply call bool
:
>>> t.bool()
tensor([False, True, False, True])
>>> t.bool().int()
tensor([0, 1, 0, 1], dtype=torch.int32)
What you're looking for is to generate a boolean mask for the given integer tensor. For this, you can simply check for the condition: "whether the values in the tensor are greater than 0" using simple comparison operator (>
) or using torch.gt()
, which would then give us the desired result.
# input tensor
In [76]: t
Out[76]: tensor([ 0, 10, 0, 16])
# generate the needed boolean mask
In [78]: t > 0
Out[78]: tensor([0, 1, 0, 1], dtype=torch.uint8)
# sanity check
In [93]: mask = t > 0
In [94]: mask.type()
Out[94]: 'torch.ByteTensor'
Note: In PyTorch version 1.4+, the above operation would return 'torch.BoolTensor'
In [9]: t > 0
Out[9]: tensor([False, True, False, True])
# alternatively, use `torch.gt()` API
In [11]: torch.gt(t, 0)
Out[11]: tensor([False, True, False, True])
If you indeed want single bits (either 0
s or 1
s), cast it using:
In [14]: (t > 0).type(torch.uint8)
Out[14]: tensor([0, 1, 0, 1], dtype=torch.uint8)
# alternatively, use `torch.gt()` API
In [15]: torch.gt(t, 0).int()
Out[15]: tensor([0, 1, 0, 1], dtype=torch.int32)
The reason for this change has been discussed in this feature-request issue: issues/4764 - Introduce torch.BoolTensor ...
TL;DR: Simple one liner
t.bool().int()