Как проверить, есть ли значения тензора в другом тензорном pytorch?

#python #python-3.x #pytorch #torch

#python #python-3.x #pytorch #факел

Вопрос:

У меня есть 2 тензора неодинакового размера

 a = torch.tensor([[1,2], [2,3],[3,4]])
b = torch.tensor([[4,5],[2,3]])
 

Мне нужен логический массив того, существует ли каждое значение в другом тензоре без итерации. что-то вроде

 a in b
 

и результат должен быть

 [False, True, False]
 

поскольку только значение a[1] находится в b

Ответ №1:

Я думаю, что это невозможно без использования хотя бы какого-то типа итерации. Самый краткий способ, которым я могу управлять, — это использовать понимание списка:

 [True if i in b else False for i in a]
 

Проверяет наличие элементов в b, которые находятся в a, и выдает [False, True, False]. Также может быть отменено, чтобы получить элементы a в b [False, True] .

Ответ №2:

это должно сработать

 result = []
for i in a:
    try: # to avoid error for the case of empty tensors
        result.append(max(i.numpy()[1] == b.T.numpy()[1,i.numpy()[0] == b.T.numpy()[0,:]]))
    except:
        result.append(False)
result
 

Ответ №3:

Если вам нужно сравнить все субтензоры по первому измерению a , используйте in :

 >>> [i in b for i in a]
[False, True, False]
 

Ответ №4:

Ни одно из решений, которые используют tensor in tensor работу во всех случаях для OP. Если тензоры содержат элементы / кортежи, которые совпадают хотя бы в одном измерении, вышеупомянутая операция вернется True для этих элементов, что потенциально приведет к многочасовой отладке. Например:

 torch.tensor([2,5]) in torch.tensor([2,10]) # returns True
torch.tensor([5,2]) in torch.tensor([5,10]) # returns True
 

Решением для вышеупомянутого может быть принудительная проверка на равенство в каждом измерении, а затем применение тензорного логического add . Обратите внимание, что следующие 2 метода могут быть не очень эффективными, поскольку Tensors они довольно медленные для итерации и проверки равенства, поэтому numpy для больших данных может потребоваться преобразование в:

 [all(torch.any(i == b, dim=0)) for i in a] # OR
[any((i[0] == b[:, 0]) amp; (i[1] == b[:, 1])) for i in a]
 

Тем не менее, решение @yuri, похоже, также работает для этих крайних случаев, но оно по-прежнему иногда дает сбой и довольно нечитаемо.