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!