Все, что вам нужно сделать, это сформировать матрицу mxn (m = num классов, n = num выборок), которая выберет подходящие веса и соответствующим образом масштабирует среднее. Затем вы можете выполнить умножение матриц между вновь сформированной матрицей и матрицей выборок.
Учитывая ваши метки, ваша матрица должна быть (каждая строка является номером класса, каждый класс - номером пробы и его весом):
[[0.0000, 0.0000, 0.0000, 1.0000],
[1.0000, 0.0000, 0.0000, 0.0000],
[0.0000, 0.5000, 0.5000, 0.0000]]
Который вы можете сформировать следующим образом:
M = torch.zeros(labels.max()+1, len(samples))
M[labels, torch.arange(4)] = 1
M = torch.nn.functional.normalize(M, p=1, dim=1)
torch.mm(M, samples)
Выход:
tensor([[0.0000, 0.0000],
[0.1000, 0.1000],
[0.3000, 0.3000]])
Обратите внимание, что средства вывода правильно отсортированы в порядке классов.