Суммирование тензора факела на основе другого тензора

#python #vectorization #torch

Вопрос:

У меня есть два тензора, где первый содержит поплавки, а второй содержит 0 и 1. Я хочу суммировать первый тензор на основе второго тензора. Более конкретно, я хочу подвести итог между появлением двух нулей. Например, рассмотрим

 a = tensor([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
b = tensor([0., 1., 1., 1., 0., 1., 1., 1., 1., 0.])
 

Мне нужна некоторая векторизованная (предпочтительно) операция, которая принимает два тензора и возвращает

 c = tensor([4., 5., 1.] 
 

c-это просто сумма элементов тензора a между вхождением двух нулей в тензоре b.

Ответ №1:

вы можете использовать torch.tensor_split , чтобы разделить свой тензор на индексы 0 в b, а затем суммировать их по отдельности:

Напр.:

 a = tensor([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
b = tensor([0., 1., 1., 1., 0., 1., 1., 1., 1., 0.])
group = torch.tensor_split(a, torch.where(b==0)[0])
# Output:
# (tensor([]),
# tensor([1., 1., 1., 1.]),
# tensor([1., 1., 1., 1., 1.]),
# tensor([1.]))

individual_sum = list(map(torch.sum, group))  # You can use loop/list comprehension etc
# Output
# [tensor(0.), tensor(4.), tensor(5.), tensor(1.)]
 

Обратите внимание, что 1-й 0 также учитывается и приводит к пустому тензору после разделения. Вы можете удалить это во время объединения

 torch.tensor(individual_sum[1:])
# Output
# tensor([4., 5., 1.])