import numpy as np
test = np.array([9,1,3,4,8,7,2,5,6,0])
temp = np.argpartition(-test, 4)
result_args = temp[:4]
temp = np.partition(-test, 4)
result = -temp[:4]
结果:
>>> result_args
array([0, 4, 8, 5]) # indices of highest vals
>>> result
array([9, 8, 6, 7]) # highest vals
时间安排:
In [16]: a = np.arange(10000)
In [17]: np.random.shuffle(a)
In [18]: %timeit np.argsort(a)
1000 loops, best of 3: 1.02 ms per loop
In [19]: %timeit np.argpartition(a, 100)
10000 loops, best of 3: 139 us per loop
In [20]: %timeit np.argpartition(a, 1000)
10000 loops, best of 3: 141 us per loop
numpy 1.8
实现partition
和argpartition
,它们执行部分排序(在O(n)时间内,而不是完全排序(O(n)*log(n))。结果:
时间安排:
^{} 模块有一个快速的部分排序方法,直接与Numpy数组一起工作:^{} 。
请注意,} 。
bottleneck.partition()
返回已排序的实际值,如果需要排序值的索引(返回的是什么),则应使用^{我的基准是:
z = -bottleneck.partition(-a, 10)[:10]
z = a.argsort()[-10:]
z = heapq.nlargest(10, a)
其中
a
是一个随机的1000000元素数组。时间安排如下:
bottleneck.partition()
:每个循环25.6毫秒np.argsort()
:每个循环198毫秒heapq.nlargest()
:每个循环358毫秒提出的瓶颈解决方案中的每个负号
复制数据。我们可以通过
也是建议的numpy解决方案
返回索引而不是值。修复方法是使用索引查找值:
两个瓶颈解决方案的相对速度取决于初始数组中元素的顺序,因为这两种方法在不同的点上分割数据。
换句话说,使用任何一个特定的随机数组计时都可以使这两种方法看起来更快。
平均100个随机数组的时间,每个数组有1000000个元素,给出
其中定时代码如下:
相关问题 更多 >
编程相关推荐