Skip to content Skip to sidebar Skip to footer

How Pytorch Tensor Get The Index Of Specific Value

In python list, we can use list.index(somevalue). How can pytorch do this? For example: a=[1,2,3] print(a.index(2)) Then, 1 will be output. How can a pytorch tensor do th

Solution 1:

I think there is no direct translation from list.index() to a pytorch function. However, you can achieve similar results using tensor==number and then the nonzero() function. For example:

t = torch.Tensor([1, 2, 3])
print ((t == 2).nonzero(as_tuple=True)[0])

This piece of code returns

1

[torch.LongTensor of size 1x1]

Solution 2:

For multidimensional tensors you can do:

(tensor == target_value).nonzero(as_tuple=True)

The resulting tensor will be of shape number_of_matches x tensor_dimension. For example, say tensor is a 3 x 4 tensor (that means the dimension is 2), the result will be a 2D-tensor with the indexes for the matches in the rows.

tensor = torch.Tensor([[1, 2, 2, 7], [3, 1, 2, 4], [3, 1, 9, 4]])
(tensor == 2).nonzero(as_tuple=False)
>>> tensor([[0, 1],
        [0, 2],
        [1, 2]])

Solution 3:

Based on others' answers:

t = torch.Tensor([1, 2, 3])
print((t==1).nonzero().item())

Solution 4:

Can be done by converting to numpy as follows

import torch
x = torch.range(1,4)
print(x)
===> tensor([ 1.,  2.,  3.,  4.]) 
nx = x.numpy()
np.where(nx == 3)[0][0]
===> 2

Solution 5:

The answers already given are great but they don't handle when I tried it when there is no match. For that see this:

def index(tensor: Tensor, value, ith_match:int =0) -> Tensor:
    """
    Returns generalized index (i.e. location/coordinate) of the first occurence of value
    in Tensor. For flat tensors (i.e. arrays/lists) it returns the indices of the occurrences
    of the value you are looking for. Otherwise, it returns the "index" as a coordinate.
    If there are multiple occurences then you need to choose which one you want with ith_index.
    e.g. ith_index=0 gives first occurence.

    Reference: https://stackoverflow.com/a/67175757/1601580
    :return:
    """# bool tensor of where value occurred
    places_where_value_occurs = (tensor == value)
    # get matches as a "coordinate list" where occurence happened
    matches = (tensor == value).nonzero()  # [number_of_matches, tensor_dimension]if matches.size(0) == 0:  # no matchesreturn -1else:
        # get index/coordinate of the occurence you want (e.g. 1st occurence ith_match=0)index = matches[ith_match]
        returnindex

credit to this great answer: https://stackoverflow.com/a/67175757/1601580

Post a Comment for "How Pytorch Tensor Get The Index Of Specific Value"