Let’s assume that I have a 3D tensor x = torch.rand(4, 17, 128)
, from which I want to average a selected span of elements (of variable length) for each row:
spans = [[[1, 3], [6,10], [11, 15]],
[[1, 10]],
[[1, 5]],
[[1,7], [8,16]]]
For example, in this case, I want to average elements 1
to 3
, 6
to 10
, and 11
to 15
from row one, then elements 1
to 10
from row two, etc. Each of the averaged tensors, in this case, will be of shape (128,)
. Then, I want to insert the span average to another tensor, defined as:
# 4
num_elements = len(spans)
# 3
max_spans = max([len(span) for span in spans])
# [128]
remaing_dims = x.size()[2:]
# [4, 3, 128]
output = torch.zeros(num_elements, max_spans, *remaing_dims)
Currently, in order to do what I want I do the following:
for i, element_spans in enumerate(spans):
for j, span in enumerate(element_spans):
output[i, j] = x[i, span[0]:span[1]].mean(0)
which is a really brute-force kind of approach. Therefore, I am wondering how can I speed-up the whole select-average-insert.
Thanks in advance!