快速numpy / torch语法来合并具有相同列值的行

问题描述 投票:0回答:1

我给出了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* ]

我的目标是根据位置向量沿第一维合并(最大,求和或平均)值。即具有相同位置矢量(此处为第5个值)的所有行都应结合给定的对称函数(让我们说sum()),同时保持第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])到dict然后将其转换回数组来实现。

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

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

[在给定的示例中,位置向量可能是n维的,没有排序。]

python numpy matrix-multiplication tensor torch
1个回答
0
投票

所以这是基于我在评论中提到的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. 具有相同目标值的元素彼此相邻。这应该很好,因为diff行为将是相同的(可能必须添加np.where(np.diff(...)!=0)
  2. 相同的目标值分散了,那么顺序不应该问题,因为在聚集后没有逻辑方法可以映射它们。

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.