Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用快速numpy/torch语法来池具有相同列值的行_Python_Numpy_Matrix Multiplication_Tensor_Torch - Fatal编程技术网

Python 使用快速numpy/torch语法来池具有相同列值的行

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

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

我的目标是根据第一维度的位置向量,将这些值汇集在一起(max、sum或avg)。也就是说,具有相同位置向量(此处为第5个值)的所有行应在保持第5个值不变的情况下,根据某种对称函数(比如sum())进行组合。产生一个新的形状数组(n',5)

当然,这可以通过在数组上循环并使用
键,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)])