我們需要使用將按照排序順序保存的索引列表,而不是將第k個參數作爲標量進行提供。因此,爲了保持整個第一5
要素排序的性質,而不是np.argpartition(a,5)[:5]
,根本就 -
np.argpartition(a,range(5))[:5]
這裏有一個樣品運行,以把事情說清楚 -
In [84]: a = np.random.rand(10)
In [85]: a
Out[85]:
array([ 0.85017222, 0.19406266, 0.7879974 , 0.40444978, 0.46057793,
0.51428578, 0.03419694, 0.47708 , 0.73924536, 0.14437159])
In [86]: a[np.argpartition(a,5)[:5]]
Out[86]: array([ 0.19406266, 0.14437159, 0.03419694, 0.40444978, 0.46057793])
In [87]: a[np.argpartition(a,range(5))[:5]]
Out[87]: array([ 0.03419694, 0.14437159, 0.19406266, 0.40444978, 0.46057793])
請注意,argpartition
有道理的性能方面,如果我們希望爲一小部分元素獲得排序索引,我們假設k
元素的數量是元素總數的一小部分。
讓我們用一個更大的數據集,並試圖讓所有elems的排序指標,以使上述點明確 -
In [51]: a = np.random.rand(10000)*100
In [52]: %timeit np.argpartition(a,range(a.size-1))[:5]
10 loops, best of 3: 105 ms per loop
In [53]: %timeit a.argsort()
1000 loops, best of 3: 893 µs per loop
因此,所有elems的排序,np.argpartition
是不是要走的路。
現在,讓我們說,我想僅前5個elems的與大數據集來分類的指數,並保持了爲了使這些 -
In [68]: a = np.random.rand(10000)*100
In [69]: np.argpartition(a,range(5))[:5]
Out[69]: array([1647, 942, 2167, 1371, 2571])
In [70]: a.argsort()[:5]
Out[70]: array([1647, 942, 2167, 1371, 2571])
In [71]: %timeit np.argpartition(a,range(5))[:5]
10000 loops, best of 3: 112 µs per loop
In [72]: %timeit a.argsort()[:5]
1000 loops, best of 3: 888 µs per loop
非常有用的在這裏!
「當我想我應該得到與排序數組相同的結果嗎?」 - 不,那不是'argpartition'的工作方式。再次閱讀[docs](https://docs.scipy.org/doc/numpy/reference/generated/numpy.argpartition.html)。 'argpartition'對分區內元素的順序沒有任何承諾。 – user2357112
文檔的「分區順序」可能有點混亂。 'argpartition'和'partition'只將操作數分成底部k個元素和其餘部分。如何訂購單個組未定義。否則,這些函數不能與保證的O(n)一起使用。 –
所以我猜argpartiton上的'argsort'做同樣的任務只會慢一點,但是命令會有保證嗎? – rookie