Python 使用快速numpy/torch语法来池具有相同列值的行
我给出了一个n值的数组/张量,其中每个由一个特征向量(在本例中为前4个值)和一个位置向量(在本例中为第5个值)组成。因此,这里的整个数组是形状(n,5) 我的目标是根据第一维度的位置向量,将这些值汇集在一起(max、sum或avg)。也就是说,具有相同位置向量(此处为第5个值)的所有行应在保持第5个值不变的情况下,根据某种对称函数(比如sum())进行组合。产生一个新的形状数组(n',5) 当然,这可以通过在数组上循环并使用Python 使用快速numpy/torch语法来池具有相同列值的行,python,numpy,matrix-multiplication,tensor,torch,Python,Numpy,Matrix Multiplication,Tensor,Torch,我给出了一个n值的数组/张量,其中每个由一个特征向量(在本例中为前4个值)和一个位置向量(在本例中为第5个值)组成。因此,这里的整个数组是形状(n,5) 我的目标是根据第一维度的位置向量,将这些值汇集在一起(max、sum或avg)。也就是说,具有相同位置向量(此处为第5个值)的所有行应在保持第5个值不变的情况下,根据某种对称函数(比如sum())进行组合。产生一个新的形状数组(n',5) 当然,这可以通过在数组上循环并使用键,value=positional\u vector,sum(feat
键,value=positional\u vector,sum(feature\u vector,dict[positional\u vector])
将它们保存到一个dict中来实现,然后将其转换回数组
不幸的是,这种方法似乎相当缓慢,当我计划在神经网络的训练中使用这种方法时,使用一些张量/矩阵乘法似乎更明智
我非常感谢任何有益的评论:)
[与给定示例相反,位置向量可能是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)])
代码很简单,它查找最后一行的值发生更改的索引,在这些位置拆分数组,并根据需要将其聚合
现在,如果数据未在最后一行排序,则会出现两种情况:
np.where(np.diff(…)!=0)
希望这有帮助。为什么不使用
pandas.DataFrame.groupby
?因为设置是神经网络训练,我要求所有内容都是torch.tensors,以便我以后可以计算梯度。您可以使用DF.values
并将其输入torch.tensor
。但是如果您希望它是严格的向量运算,则需要排序。您可以计算最后一列中的diff
,并在diff
值非零的索引之间求和。您可以详细说明我如何在diff值非零的索引之间高效求和吗?在计算并添加diff
之后,很高兴听到这个消息。
[ 1 2 3 4 *0* ]
[ 5 2 0 2 *1* ]
[ 2 2 5 8 *2* ]
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)])