gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:13:12 26 4
gpt4 key购买 nike

我正在尝试在 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 .

您在 w[np.argsort(z)[::-1]][:7] 中遇到了麻烦的 np.argsort,它本质上是 w[idx],其中 idx = np.argsort(z)[::-1][:7]

所以,idx 可以用np.argpartition 来计算,就像这样-

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 - 在python中对大量数组进行排序的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37035082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com