我需要在一个一维的 numpy.array
中找到最小的第n个元素。
例如:
a = np.array([90,10,30,40,80,70,20,50,60,0])
我希望得到第五小的元素,所以我的期望输出是40
。
目前我的解决方案如下:
result = np.max(np.partition(a, 5)[:5])
然而,对我来说找到5个最小元素,然后从它们中选出最大的那个似乎有点笨拙。是否有更好的方法呢?我错过了一个能实现我的目标的函数吗?
有类似标题的问题,但我没有看到任何回答我的问题。
编辑:
我本应该在原文中提到这一点,但性能对我非常重要;因此,heapq
的解决方案虽然不错,但对我无法使用。
import numpy as np
import heapq
def find_nth_smallest_old_way(a, n):
return np.max(np.partition(a, n)[:n])
# Solution suggested by Jaime and HYRY
def find_nth_smallest_proper_way(a, n):
return np.partition(a, n-1)[n-1]
def find_nth_smallest_heapq(a, n):
return heapq.nsmallest(n, a)[-1]
#
n_iterations = 10000
a = np.arange(1000)
np.random.shuffle(a)
t1 = timeit('find_nth_smallest_old_way(a, 100)', 'from __main__ import find_nth_smallest_old_way, a', number = n_iterations)
print 'time taken using partition old_way: {}'.format(t1)
t2 = timeit('find_nth_smallest_proper_way(a, 100)', 'from __main__ import find_nth_smallest_proper_way, a', number = n_iterations)
print 'time taken using partition proper way: {}'.format(t2)
t3 = timeit('find_nth_smallest_heapq(a, 100)', 'from __main__ import find_nth_smallest_heapq, a', number = n_iterations)
print 'time taken using heapq : {}'.format(t3)
结果:
time taken using partition old_way: 0.255564928055
time taken using partition proper way: 0.129678010941
time taken using heapq : 7.81094002724