繁体   English   中英

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

[英]Fastest way to sort a large number of arrays in python

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

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

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

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

谁能告诉我在Python中执行此操作的更快方法?

谢谢

编辑

添加一个例子

如果我有以下数据框:

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.argsortw[np.argsort(z)[::-1]][:7] ,本质上是w[idx] ,其中idx = np.argsort(z)[::-1][:7]

因此,可以使用np.argpartition计算idx ,就像这样-

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

需要-z是因为默认情况下np.argpartition尝试获取升序排序的索引。 因此,要扭转这种局面,我们已经取消了要素。

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

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

python比R慢得多的原因是python不会类型转换变量(即int,string,float),因此用于确定哪个值较大的每个比较的一部分都用于确定变量类型。

您不能仅使用python来解决此问题,但可以使用cython包括类型定义(ctypes和psyco也可以执行相同的功能,但我更喜欢cython)。 http://docs.cython.org/src/quickstart/cythonize.html上有一个简单的示例。

Cython会编译python文件的.c版本,可以导入该文件而不是.py来缩短运行时间。 http://docs.cython.org/src/reference/compilation.html上显示了使用cython进行编译的所有可能方式。

您的输入和输出有点混乱。 请提供一些示例数据。

但是请注意: http : //pandas.pydata.org/pandas-docs/stable/api.html#reshaping-sorting-transpose熊猫排序已得到了尽可能的优化。 将重点放在系列排序上,因为DataFrame的每一列都更准确地表示为一个系列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM