2012-04-13 101 views

回答

3

做到這一點,最簡單的方法就是進行排序,然後用最後n號碼。這也可以在不改變原始數組的情況下完成。下面是一個例子,如何找到最大的10個號碼中的一個10×10陣列:

a = numpy.random.randint(1000, size=100).reshape(10, 10) 
indices = a.ravel().argsort() 
print a.ravel()[indices[-10:]] 

此代碼打印像

array([909, 917, 926, 936, 952, 960, 961, 964, 969, 993]) 
+0

這是爲O(n log n)的,雖然比O(N日誌K)(其中k是數項返回)的明顯實現(無想法如何在numpy中獲得)。如果我們不改變數組,它也是O(n)對O(k)和內存。 – Voo 2012-04-13 19:57:18

+0

@Voo:使用堆隊列「你明白的解決方案」是什麼意思?在NumPy中沒有堆實現,即使對於非常大的數組,Python的heapq模塊也會比上面的代碼慢。你有什麼實用的建議如何改善這個代碼? – 2012-04-13 20:04:41

+0

我應該說明顯的「算法」很抱歉。正如我所說我沒有看到任何方式在numpy本身有效地實現這一點。我假設寫一個特定於該問題的C擴展可行,但這樣做並不簡單。這很大程度上取決於n和k的大小,這對我們有什麼幫助。如果簡單的排序解決方案足夠好,顯然就是這樣。 – Voo 2012-04-13 20:09:08

0

這也可能是最有效的reverse-sort陣列,並且採取先N元素:

a = [1,2,3] 
sorted(a, reverse=True)[:2] 

如果要查找多維數組中最大的元素,請使用a.ravel()其中un滾動到一個維度

正如書面所述,這實際上並不使用numpy,但您可以使用np.sort做類似的事情,不過您必須自己將其顛倒過來,例如,通過索引[::-1],巴洛克式的前瞻性

np.sort(a.ravel())[::-1][:2] 
+0

從標題判斷,我認爲OP希望將其應用於多維NumPy數組。 – 2012-04-13 19:51:56

相關問題