#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, похоже, также работает для этих крайних случаев, но оно по-прежнему иногда дает сбой и довольно нечитаемо.