快速的 numpy/torch 语法,以汇集具有相同列值的行



我给出了一个由 n 个值组成的数组/张量,其中每个值由一个特征向量(在示例中是前 4 个值(和一个位置向量(在示例中是第 5 个值(组成。因此,这里的整个数组的形状为 (n, 5(。

[ 1 2 3 4 *0* ]
[ 5 1 0 1 *1* ]
[ 0 1 0 1 *1* ]
[ 1 0 3 0 *2* ]
[ 1 1 2 6 *2* ]
[ 0 1 0 2 *2* ]

我的目标是根据它们的位置向量沿第一维汇集(最大值或总和或平均(值。 即,给定一些对称函数(假设 sum(((的所有具有相同位置向量(此处为 5th 值(的行都应组合在一起,同时保持所述第 5 个值不变。生成新的形状数组 (n', 5(

[ 1 2 3 4 *0* ]
[ 5 2 0 2 *1* ]
[ 2 2 5 8 *2* ]

当然,这可以通过循环数组并将它们全部保存到带有key, value = positional_vector, sum(feature_vector, dict[positional_vector])的字典中,然后将其转换回数组来实现。

不幸的是,这种方法看起来相当慢,当我计划在神经网络的训练中使用它时,使用一些张量/矩阵乘法魔法似乎更明智。

我非常感谢任何有用的评论:)

[与给定的例子相反,位置向量可能是n维的并且不是有序的。

所以这是一个基于我在评论中提到的diff方法的粗略答案。请注意,由于您需要基于组的 agg 操作,因此没有真正的方法可以有效地对其进行矢量化。此外,此示例假设您的数据已排序,我们稍后会回到它。

def reduce(x): return np.r_[x[:,:-1].sum(axis=0), x[0,-1]]
x = np.array([[ 1, 2, 3, 4, 0 ],
[ 5, 1, 0, 1, 1 ],
[ 0, 1, 0, 1, 1 ],
[ 1, 0, 3, 0, 2 ],
[ 1, 1, 2, 6, 2 ],
[ 0, 1, 0, 2, 2 ] ])
ind = np.where(np.diff(x[:,-1], prepend=x[0,-1]))[0]
x_agg = np.array([reduce(i) for i in np.split(x, ind)])

代码很简单,它找到最后一行的值已更改的索引,在这些位置上拆分数组并根据需要聚合它。

现在,如果数据未在最后一行中排序,则会出现两种情况:

  1. 具有相同目标值的元素彼此相邻。这应该没问题,因为差异行为是相同的(也许必须添加一个条件
  2. ,例如np.where(np.diff(...)!=0)
  3. 相同的目标值分散,则顺序不应该 重要的是,聚集后没有合乎逻辑的方法来绘制它们。

希望这有帮助。

最新更新