यहाँ एक मूल 2D सरणी है
in_arr = np.array([[20,0,10,40,30], [50,40,60,90,80]])
# original array
# [[20, 0, 10, 40, 30],
# [50, 40, 60, 90, 80]]
मुझे अवरोही और पंक्ति द्वारा सरणी को सॉर्ट करने की आवश्यकता है, इसलिए, मैं numpy.argsort(axis=1) का उपयोग करता हूं, और आउटपुट सॉर्ट किए गए इंडेक्स मुझे मिला है
out_arr1 = np.argsort(in_arr, axis = 1)[:,::-1]
>>> array([[3, 4, 0, 2, 1],
[3, 4, 2, 0, 1]])
फिर, मुझे प्रत्येक सरणी पंक्ति से पहली 3 सबसे बड़ी संख्या निकालने की आवश्यकता है, नमूना वांछित आउटपुट निम्नानुसार है:
# first 3 largest number from each row
# [[40,30,20],
# [90,80,60]]
मुझे सही समाधान निकालने की कोशिश करने के लिए कुछ घंटों का संघर्ष करना पड़ा है, लेकिन मुझे अभी भी पता नहीं है कि मुझे कैसे करना चाहिए, यहां मदद मांगना है। आपके बहुमूल्य समय और सलाह की बहुत सराहना की जाएगी। शुक्रिया!
3 जवाब
numpy.argsort()
का उपयोग करके सॉर्ट किए गए सरणी के लिए सूचकांकों की एक सरणी देता है। जैसे, आपका out_arr1
आपको बताता है कि प्रत्येक पंक्ति में उच्चतम मान खोजने के लिए कहां है।
यदि आप इस तरह से जारी रखना चाहते हैं, तो आपको in_arr में प्रत्येक पंक्ति के लिए क्या करना होगा (इसके द्वारा in_arr[i]
के रूप में लिखा गया है) out_arr1[i]
में पहले 3 सूचकांकों में पाए गए मान लें।
इसका मतलब यह है कि out_arr1[i, 0]
आपको बताता है कि पंक्ति i
पर in_arr में उच्चतम मान कहां स्थित है। हमारे मामले में, out_arr1[0, 0] = 3
, जिसका अर्थ है कि पंक्ति 0 में उच्चतम मान 40 है (सूचकांक 3 पर)
ऐसा करने पर, प्रत्येक पंक्ति में 3 सबसे बड़ी संख्याओं को out_arr1[0, 0]
, out_arr1[0, 1]
, out_arr1[0, 2]
और out_arr1[1, 0]
, out_arr1[1, 1]
, out_arr1[1, 2]
द्वारा दर्शाया जाता है।
वांछित आउटपुट प्राप्त करने के लिए, हमें निम्न की तर्ज पर कुछ चाहिए:
final_arr = numpy.array([in_arr[0, out_arr1[0, 0], in_arr[0, out_arr1[0, 1], in_arr[0, out_arr1[0, 2], in_arr[1, out_arr1[1, 0], in_arr[1, out_arr1[1, 1], in_arr[1, out_arr1[1, 2]])
हालाँकि, यह सुरुचिपूर्ण से कम है, और आपकी समस्या का एक और आसान समाधान है।
numpy.argsort()
के बजाय numpy.sort()
का उपयोग करके हम अक्ष के साथ क्रमबद्ध in_arr
के सटीक मान वापस कर सकते हैं। ऐसा करने से, हमें अपने 3 उच्चतम मूल्यों को खोजने के लिए आउटपुट इंडेक्स का उपयोग करने की आवश्यकता नहीं है, क्योंकि वे हमारे नए आउटपुट में पहले 3 हैं।
out_arr2
को numpy.sort()
से आउटपुट के रूप में देखते हुए, अंतिम सरणी इस तरह दिखेगी:
final_arr = numpy.array([[out_arr[0, 0], out_arr[0, 1], out_arr[0, 2]], [out_arr[1, 0], out_arr[1, 1], out_arr[1, 2]]])
इस इस उत्तर के आधार पर आप ऐसा कुछ कर सकते हैं
np.array(list(map(lambda x, y: y[x], np.argsort(in_arr), in_arr)))[:,::-1][:,:3]
जो देता है
array([[40, 30, 20],
[90, 80, 60]])
आप पहले इनपुट सरणी में सभी पंक्तियों को sorted
का उपयोग करके सूची समझ के साथ सॉर्ट कर सकते हैं। फिर आप पंक्तियों की अंतिम 3 संख्याएँ निकालते हैं।
in_arr = np.array([[20,0,10,40,30], [50,40,60,90,80]])
output = []
for i in [sorted(row) for row in in_arr]:
output.append(i[-3:][::-1])
print(output)
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।