我有这样的数组:
array([[2, 1],
[3, 5],
[2, 1],
[4, 2],
[2, 3],
[5, 3]])
我想做的是'group-by'按第一列求和,然后按第二列排序:
array([[2, 5],
[3, 5],
[5, 3],
[4, 2]])
这里有一个转折,我还想从结果数组中的每一行的原始数组中获取索引,排序:
2 3 5 4
[[0,2,4], [1], [5], [3] ]
如果它很容易…我需要得到前N个索引.假设top 2:
2 3
[0,2,4, 1]
没有Pandas,只有纯粹的numpy。
顺便说一句,我只需要前N个项目和他们的索引。这可以简化加速该过程
试着应用这些
https://izziswift.com/is-there-any-numpy-group-by-function
3条答案
按热度按时间e37o9pze1#
遗憾的是,Numpy中没有group by,但您可以使用
np.unique
来查找唯一元素及其索引,这足以实现您所需要的内容。一旦确定了键,就可以使用np.add.at
执行基于键的归约。对于sort by值,可以使用np.argsort
。有关详细信息,请参阅this post和this one。请注意,索引可以很容易地从
index
变量(这是一个反向索引)获得。没有办法用Numpy来构建它,但是可以使用一个简单的Python循环来积累索引i
,这些索引存储在字典中的列表中,每个键keys[index[i]]
。下面是一个示例:kx1ctssn2#
我对这个解决方案不满意,也无法验证它不会与其他数据中断。它使用了引用的思想来分组,但求和为
add.reduceat
。输出
要获得每个组的索引,
输出
fdbelqdn3#
你可能会发现一个简单的通用
group_by
函数很有用,我发布了这个问题:https://stackoverflow.com/a/77150915/3671939您可以使用它来解决这个问题,如下所示:
请注意,该函数是快速的,但不利用“只有N顶”的要求。这可以通过使用
np.argpartition
来完成,然后对较小的数组进行排序,尽管它可能不会产生任何显著的好处,因为group_by部分具有O(n log n)的复杂度和许多常量: