2015-10-17 24 views
5

Có rất nhiều giải pháp để làm việc này cho một mảng duy nhất, nhưng những gì về một ma trận, chẳng hạn như:Cách nhanh nhất để tìm giá trị lớn nhất thứ n trong một ma trận NumPy

>>> k 
array([[ 35, 48, 63], 
     [ 60, 77, 96], 
     [ 91, 112, 135]]) 

Bạn có thể sử dụng k.max(), nhưng tất nhiên điều này chỉ trả về giá trị cao nhất, 135. Nếu tôi muốn thứ hai hoặc thứ ba thì sao?

+2

Hãy xem câu trả lời này: http://stackoverflow.com/questions/26603747/get-the-indices-of-n-highest-values-in-an-ndarray – NJM

Trả lời

8

Bạn có thể flatten ma trận và sau đó sắp xếp nó:

>>> k = np.array([[ 35, 48, 63], 
...  [ 60, 77, 96], 
...  [ 91, 112, 135]]) 
>>> flat=k.flatten() 
>>> flat.sort() 
>>> flat 
array([ 35, 48, 60, 63, 77, 91, 96, 112, 135]) 
>>> flat[-2] 
112 
>>> flat[-3] 
96 
+4

'np.partition' có thể nhanh hơn - nó phân loại một phần, chỉ đủ để chia mảng thành 2 phần. – hpaulj

+0

Ooh Tôi thích điều đó. – rofls

+0

Phương pháp này có thể tốt hơn nếu anh ta muốn lấy nhiều phần tử, nói thứ 2, lớn thứ 3, v.v ... vì tất cả chúng sẽ có sẵn mà không có hoạt động nào khác ngoài lập chỉ mục. – rofls

6

Như said, np.partition nên nhanh hơn (tối đa là O (n) thời gian chạy):

np.partition(k.flatten(), -2)[-2] 

nên trả lại 2 yếu tố lớn nhất. (partition đảm bảo rằng phần tử được đánh số ở vị trí, tất cả các phần tử trước đó nhỏ hơn và tất cả các phần tử phía sau đều lớn hơn).

0
import numpy as np 
a=np.array([[1,2,3],[4,5,6]]) 
a=a.reshape((a.shape[0])*(a.shape[1])) # n is the nth largest taken by us 
print(a[np.argsort()[-n]]) 
+2

Cảm ơn bạn đã đóng góp. Câu trả lời của bạn có thể hữu ích hơn nếu bạn giải thích suy nghĩ của mình. –

Các vấn đề liên quan