首页 > 解决方案 > 如何避免在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 的解决方案。

标签: numpypytorch

解决方案


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)

推荐阅读