如何避免在pytorch或numpy中拆分和求和

如何避免在pytorch或numpy中拆分和求和,numpy,pytorch,Numpy,Pytorch,我想把一个长向量分成更小的不相等的部分,对每个部分进行求和,然后将结果收集到一个新的向量中。 我需要在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.one和np.split 有没有更有效的方法 编辑: 受第一条评论的启

我想把一个长向量分成更小的不相等的部分,对每个部分进行求和,然后将结果收集到一个新的向量中。 我需要在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.one和np.split

有没有更有效的方法

编辑: 受第一条评论的启发:

indices = np.cumsum([0]+sizes)[:-1]
Y = np.add.reduceat(X, indices.tolist())
为numpy解决它。我仍在寻找Pytork的解决方案。

是你的朋友

# 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)

查找
numpy.reduceat
。太好了!这就解决了numpy的问题。感谢@Divakara以更高效的方式生成
ind
ind=torch.arange(len(size))。重复交错(size)