作为我正在构建的机器学习架构的一部分,我需要在pytorch中并行化某些计算。为简单起见,我将陈述问题的修改版本,并使用numpy,以便更容易理解。
假设我有一组足球队(假设10支),他们进行一组比赛(假设20场)。每个足球队由一个ID(1-10之间的数字)表示。比赛结果保存为元组(t_1, t_2, win)
,其中t_i
是'team i'的ID (int),如果team 1获胜,则win=1(如果team 2获胜,则win=-1)。
我想计算每个队的总胜场数。更具体地说,我想要一个numpy数组X
(形状(10)),其中X[t_i]
:=赢-输(来自20场比赛的"团队I")。假设匹配数据被分成numpy数组match
(of shape(20,2))和outcome
(of shape(20,1)),我目前解决这个问题的方法如下
outcome = np.concatenate((outcome, -outcome), axis=1)
for i in range(20):
X[match[i]] += outcome[i]
现在你可以猜到,我想摆脱for循环。如果我要用
替换这段代码X[match] += outcome
那么显然它不会工作。有人有什么办法可以完全并行地解决这个问题吗?就像我说的,我的问题实际上比我在这里陈述的要复杂得多。这更接近于计算每支球队中每个球员的输赢总数。如果可能的话,有人能提供一个不依赖于每场比赛只有两支球队的解决方案吗?提前谢谢。
对于任何看到这一点的人,我在pytorch中使用'scatter'找到了一个解决方案,但是它有点特别。下面是numpy的等效代码。
outcome = np.concatenate((outcome, -outcome), axis=1)
temp = np.put_along_axis(np.zeros((20, 10)), match, outcomes, 1)
scores = np.sum(temp, axis=0)