यहाँ एक मूल 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]]

मुझे सही समाधान निकालने की कोशिश करने के लिए कुछ घंटों का संघर्ष करना पड़ा है, लेकिन मुझे अभी भी पता नहीं है कि मुझे कैसे करना चाहिए, यहां मदद मांगना है। आपके बहुमूल्य समय और सलाह की बहुत सराहना की जाएगी। शुक्रिया!

1
Yeo Keat 31 जिंदा 2021, 13:30

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]]])
2
Stefan 31 जिंदा 2021, 16:54

इस इस उत्तर के आधार पर आप ऐसा कुछ कर सकते हैं

np.array(list(map(lambda x, y: y[x], np.argsort(in_arr), in_arr)))[:,::-1][:,:3]

जो देता है

array([[40, 30, 20],
       [90, 80, 60]])
1
Stefan 31 जिंदा 2021, 13:42

आप पहले इनपुट सरणी में सभी पंक्तियों को 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)
1
Stefan 31 जिंदा 2021, 13:48