从数组中按降序获取前N个元素

时间:2016-10-23 05:36:09

标签: python numpy

我有一个数组[2, 4, 2, 1, 3, 2, 2],我希望按降序排列前3个值索引。所以我的输出应该是[1,4,0​​],这是数组前3个元素的索引,按降序排列。 (容忍类似的项目索引)。我正在使用bottelneck,它正在部分地完成我的工作。

import bottleneck
import numpy as np
a = np.array([2, 4, 2, 1, 3, 2, 2])
b = np.array(bottleneck.argpartsort(-a, 3)[:3])
print(b)

给出[4 1 5],它们是数组的正确顶部3(n)索引,但不是降序。是否有任何内置函数可以调整此输出以提供降序

2 个答案:

答案 0 :(得分:4)

您可以使用np.argsort

import numpy as np
a = np.array([2, 4, 2, 1, 3, 2, 2])
b = np.argsort(a)[-3:]
b = b[::-1]

注意:最后两行可以进一步简化为(虽然没有太大的计算优势)

b = np.argsort(a)[-3:][::-1]
# or, as juanpa suggested
b = np.argsort(a)[-1:-4:-1]

所有提供以下b

的值
array([1, 4, 6])

答案 1 :(得分:1)

我相信bottleneck.argpartsortnp.argpartiton类似。所以,让我们使用它。现在,使用np.argpartiton代替3,我们需要使用range(3)来保持排序顺序。只需一个标量,argpartiton就不会对这些3元素进行排序,但是range(3)会对In [360]: a Out[360]: array([ 0.6082239 , 0.74932587, 0.50574681, 0.85241966, 0.91742228, 0.9984438 , 0.6876266 , 0.90651069, 0.53746683, 0.70674607]) In [361]: np.argpartition(-a,3) # 4,5,7 are the top 3, but not in sorted order Out[361]: array([4, 5, 7, 3, 1, 9, 6, 2, 8, 0]) In [362]: np.argpartition(-a,range(3)) # Sorted order maintained for top 3 Out[362]: array([5, 4, 7, 3, 1, 0, 6, 2, 8, 9]) 进行排序。

让我们举一个例子来展示 -

np.argpartiton

此外,对于N,它不会对数组中的其余元素进行排序,从而在那里提供运行时优势。如果我们希望按排序顺序获得最高N元素,这将非常有用,其中np.argpartiton的数字比数组的长度相对较小。

因此,我们将使用a[np.argpartition(-a,range(3))[:3]] 实现,就像这样 -

In [342]: a = np.random.rand(10000)

In [343]: %timeit a[np.argsort(a)[-1:-4:-1]] #@R. S. Nikhil Krishna's soln
1000 loops, best of 3: 907 µs per loop

In [344]: %timeit a[np.argpartition(-a,range(3))[:3]]
10000 loops, best of 3: 67.9 µs per loop

运行时测试 -

owner_change