我有一个数组[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)索引,但不是降序。是否有任何内置函数可以调整此输出以提供降序
答案 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.argpartsort
与np.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