2015-10-17 8 views
5

वहाँ इस तरह के रूप में एक एकल सरणी के लिए यह करने के लिए समाधान के बहुत सारे है, लेकिन, एक मैट्रिक्स के बारे में क्या कर रहे हैं:तेज रास्ता

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

आप k.max() उपयोग कर सकते हैं, लेकिन बेशक यह केवल उच्चतम मूल्य, 135 देता है। अगर मैं दूसरा या तीसरा चाहता हूं तो क्या होगा?

+2

इस जवाब पर एक नज़र डालें: http://stackoverflow.com/questions/26603747/get-the-indices-of-n-highest-values-in-an-ndarray – NJM

उत्तर

8

आप मैट्रिक्स flatten और फिर इसे सॉर्ट कर सकते हैं:

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

2 लौटना चाहिए:

>>> 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' तेजी से हो सकता है - यह आंशिक प्रकार करता है, सरणी को 2 भागों में विभाजित करने के लिए पर्याप्त है। – hpaulj

+0

ओह मुझे यह पसंद है। – rofls

+0

यह विधि बेहतर हो सकती है यदि वह कई तत्वों को पकड़ना चाहता है, हालांकि, दूसरा, तीसरा सबसे बड़ा, आदि कहें ... क्योंकि वे सभी इंडेक्सिंग के अलावा कोई और संचालन नहीं करेंगे। – rofls

6

said के रूप में, np.partition तेजी से (सबसे हे (एन) चल रहा है समय में) होना चाहिए सबसे बड़ा तत्व। (partition गारंटी देता है कि क्रमांकित तत्व स्थिति में है, पहले सभी तत्व छोटे हैं, और पीछे सभी बड़े हैं)।

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

योगदान के लिए धन्यवाद। यदि आप अपनी सोच समझाते हैं तो आपका उत्तर अधिक उपयोगी हो सकता है। –