與np.argpartition
和np.argsort
夫婦的做法爲ndarrays -
def k_largest_index_argpartition_v1(a, k):
idx = np.argpartition(-a.ravel(),k)[:k]
return np.column_stack(np.unravel_index(idx, a.shape))
def k_largest_index_argpartition_v2(a, k):
idx = np.argpartition(a.ravel(),a.size-k)[-k:]
return np.column_stack(np.unravel_index(idx, a.shape))
def k_largest_index_argsort(a, k):
idx = np.argsort(a.ravel())[:-k-1:-1]
return np.column_stack(np.unravel_index(idx, a.shape))
談兩個版本k_largest_index_argpartition_v1
和k_largest_index_argpartition_v2
之間argpartition
不同的是,我們是如何使用argparition
。在第一個版本中,我們是否定輸入數組,然後使用argpartition
得到最小的指數k
,從而有效地得到最大的k
指數,而在第二個版本中,我們得到第一個a.size-k
最小指數,然後我們選擇剩餘最大的k
指數。
此外,在這裏值得一提的是,與argpartition
,我們沒有得到它們的排序順序索引。如果需要排序順序,我們需要輸入範圍數組到np.argpartition
,如post
中所述。
樣品試驗 -
1)2D情況:
In [42]: a # 2D array
Out[42]:
array([[38, 14, 81, 50],
[17, 65, 60, 24],
[64, 73, 25, 95]])
In [43]: k_largest_index_argsort(a, k=2)
Out[43]:
array([[2, 3],
[0, 2]])
In [44]: k_largest_index_argsort(a, k=4)
Out[44]:
array([[2, 3],
[0, 2],
[2, 1],
[1, 1]])
In [66]: k_largest_index_argpartition_v1(a, k=4)
Out[66]:
array([[2, 1], # Notice the order is different
[2, 3],
[0, 2],
[1, 1]])
2)3D情況:
In [46]: a # 3D array
Out[46]:
array([[[20, 98, 27, 73],
[33, 78, 48, 59],
[28, 91, 64, 70]],
[[47, 34, 51, 19],
[73, 38, 63, 94],
[95, 25, 93, 64]]])
In [47]: k_largest_index_argsort(a, k=2)
Out[47]:
array([[0, 0, 1],
[1, 2, 0]])
運行測試 -
In [56]: a = np.random.randint(0,99999999999999,(3000,4000))
In [57]: %timeit k_largest_index_argsort(a, k=10)
1 loops, best of 3: 2.18 s per loop
In [58]: %timeit k_largest_index_argpartition_v1(a, k=10)
10 loops, best of 3: 178 ms per loop
In [59]: %timeit k_largest_index_argpartition_v2(a, k=10)
10 loops, best of 3: 128 ms per loop
做你想要的答案用於nD陣列的二維數組,其中n> 2? – Chris