在Python中对大量数组进行排序的最快方法

2023-12-02

我正在尝试在 python 中对大量数组进行排序。我需要一次对超过 1100 万个数组执行排序。

另外,如果我可以直接获取对数组进行排序的索引,那就太好了。

这就是为什么,到目前为止我正在使用 numpy.argsort() 但这在我的机器上太慢了(需要一个多小时才能运行)

在同一台机器上,R 中的相同操作大约需要 15 分钟。

谁能告诉我用 Python 更快地做到这一点的方法?

Thanks

EDIT:

添加示例

如果我有以下数据框:

agg:

x      y        w        z  

1      2        2        5                 
1      2        6        7         
3      4        3        3        
5      4        7        8    
3      4        2        5    
5      9        9        9    

我正在其上运行以下函数和命令:

def fucntion(group):
    z = group['z'].values   
    w = group['w'].values 
    func = w[np.argsort(z)[::-1]][:7]  #i need top 7 in case there are many  
    return np.array_str(func)[1:-1]

output = agg.groupby(['x,'y']).apply(function).reset_index()

所以我的输出数据框将如下所示:

output:

x   y   w   

1   2   6,2    
3   4   2,3    
5   4   7    
5   9   9

对于像您对部分排序索引感兴趣的情况,有NumPy's argpartition.

你有麻烦事np.argsort in : w[np.argsort(z)[::-1]][:7],这本质上是w[idx], where idx = np.argsort(z)[::-1][:7].

So, idx可以计算为np.argpartition,就像这样-

idx = np.argpartition(-z,np.arange(7))[:7]

That -z需要,因为默认情况下np.argpartition尝试按升序获取排序索引。所以,为了reverse它,我们已经否定了要素。

因此,对原始代码的拟议更改将是:

func = w[np.argpartition(-z,np.arange(7))[:7]]

运行时测试 -

In [162]: z = np.random.randint(0,10000000,(1100000)) # Random int array

In [163]: idx1 = np.argsort(z)[::-1][:7]
     ...: idx2 = np.argpartition(-z,np.arange(7))[:7]
     ...: 

In [164]: np.allclose(idx1,idx2) # Verify results
Out[164]: True

In [165]: %timeit np.argsort(z)[::-1][:7]
1 loops, best of 3: 264 ms per loop

In [166]: %timeit np.argpartition(-z,np.arange(7))[:7]
10 loops, best of 3: 36.5 ms per loop
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中对大量数组进行排序的最快方法 的相关文章

随机推荐