Как избежать разделения и суммы частей в pytorch или numpy

Я хочу разбить длинный вектор на более мелкие неравные части, выполнить суммирование каждой части и собрать результаты в новый вектор. Мне нужно сделать это в pytorch, но мне также интересно посмотреть, как это делается с помощью numpy.

Этого легко добиться, разделив вектор.

sizes = [3, 7, 5, 9]
X = torch.ones(sum(sizes))
Y = torch.tensor([s.sum() for s in torch.split(X, sizes)])

или с np.ones и np.split.

Есть ли более эффективный способ сделать это?

Редактировать:

Вдохновился первым комментарием:

indices = np.cumsum([0]+sizes)[:-1]
Y = np.add.reduceat(X, indices.tolist())

решает это для numpy. Я все еще ищу решение с pytorch.

Ищите numpy.reduceat.

Divakar 08.04.2019 09:01

Здорово! это решает это для numpy. Спасибо @Дивакар

Amir Hajibabaei 08.04.2019 09:14
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
3
2
483
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

index_add_ твой друг!

# inputs
sizes = torch.tensor([3, 7, 5, 9], dtype=torch.long)
x = torch.ones(sizes.sum())
# prepare an index vector for summation (what elements of x are summed to each element of y)
ind = torch.zeros(sizes.sum(), dtype=torch.long)
ind[torch.cumsum(sizes, dim=0)[:-1]] = 1
ind = torch.cumsum(ind, dim=0)
# prepare the output
y = torch.zeros(len(sizes))
# do the actual summation
y.index_add_(0, ind, x)

немного более эффективный способ генерации ind: ind = torch.arange(len(sizes)).repeat_interleave(sizes)

Erik 28.05.2020 03:15

Другие вопросы по теме