नम्पी argsort - यह क्या कर रही है?


123

सुन्न क्यों है यह परिणाम दे रहा है:

x = numpy.array([1.48,1.41,0.0,0.1])
print x.argsort()

>[2 3 1 0]

जब मैं यह करने की उम्मीद करूँगा:

[३ २ ० १]

स्पष्ट रूप से फ़ंक्शन के बारे में मेरी समझ में कमी है।


6
आपको क्यों लगा [3 2 0 1]कि सही उत्तर होगा?
ज़ूल

9
मुझे सिर्फ आउटपुट की उलटी समझ थी। यानी, यदि आप x का पहला तत्व लेते हैं, तो यह क्रमबद्ध सरणी के स्थान 3 में होना चाहिए और इसी तरह।
user1276273

26
आपके सोचने का तरीका पूरी तरह से समझ में आता है, मेरा बिल्कुल वही सवाल था
adrienlucca.wordpress.com

2
[३ २ ० १] - यह मूल्यों की रैंकिंग कर रहा है, आपको वास्तविक सूचकांक नहीं मिल रहा है।
लहिरू करुणारत्ने

बस याद रखने के लिए कि आउटपुट मूल सरणी में स्थानों को इंगित करता है जबकि आप इसे सॉर्ट किए गए सरणी में सोचते हैं। इसका मतलब है कि आउटपुट [0] वह इंडेक्स है जहां सबसे बड़े तत्व के लिए मूल इनपुट ऐरे में सबसे छोटा तत्व और आउटपुट [-1] है।
lincr

जवाबों:


143

प्रलेखन के अनुसार

एक सरणी को सॉर्ट करने वाले सूचकांकों को लौटाता है।

  • 2का सूचकांक है 0.0
  • 3का सूचकांक है 0.1
  • 1का सूचकांक है 1.41
  • 0का सूचकांक है 1.48

12
a = x.argsort(), प्रिंट x[a], हम प्राप्त करेंगेarray([ 0. , 0.1 , 1.41, 1.48])
बेल्टर

39

[2, 3, 1, 0] इंगित करता है कि सबसे छोटा तत्व 2 इंडेक्स पर है, 3 इंडेक्स में अगला सबसे छोटा, फिर इंडेक्स 1, फिर इंडेक्स 0।

रहे हैं कई तरीकों से परिणाम आप देख रहे हैं पाने के लिए:

import numpy as np
import scipy.stats as stats

def using_indexed_assignment(x):
    "https://stackoverflow.com/a/5284703/190597 (Sven Marnach)"
    result = np.empty(len(x), dtype=int)
    temp = x.argsort()
    result[temp] = np.arange(len(x))
    return result

def using_rankdata(x):
    return stats.rankdata(x)-1

def using_argsort_twice(x):
    "https://stackoverflow.com/a/6266510/190597 (k.rooijers)"
    return np.argsort(np.argsort(x))

def using_digitize(x):
    unique_vals, index = np.unique(x, return_inverse=True)
    return np.digitize(x, bins=unique_vals) - 1

उदाहरण के लिए,

In [72]: x = np.array([1.48,1.41,0.0,0.1])

In [73]: using_indexed_assignment(x)
Out[73]: array([3, 2, 0, 1])

यह जाँच करता है कि वे सभी एक ही परिणाम देते हैं:

x = np.random.random(10**5)
expected = using_indexed_assignment(x)
for func in (using_argsort_twice, using_digitize, using_rankdata):
    assert np.allclose(expected, func(x))

ये IPython %timeitबेंचमार्क बड़े सरणियों using_indexed_assignmentके लिए सबसे तेज़ है:

In [50]: x = np.random.random(10**5)
In [66]: %timeit using_indexed_assignment(x)
100 loops, best of 3: 9.32 ms per loop

In [70]: %timeit using_rankdata(x)
100 loops, best of 3: 10.6 ms per loop

In [56]: %timeit using_argsort_twice(x)
100 loops, best of 3: 16.2 ms per loop

In [59]: %timeit using_digitize(x)
10 loops, best of 3: 27 ms per loop

छोटे सरणियों के लिए, using_argsort_twiceतेज हो सकता है:

In [78]: x = np.random.random(10**2)

In [81]: %timeit using_argsort_twice(x)
100000 loops, best of 3: 3.45 µs per loop

In [79]: %timeit using_indexed_assignment(x)
100000 loops, best of 3: 4.78 µs per loop

In [80]: %timeit using_rankdata(x)
100000 loops, best of 3: 19 µs per loop

In [82]: %timeit using_digitize(x)
10000 loops, best of 3: 26.2 µs per loop

ध्यान दें कि stats.rankdataआपको समान मूल्य के तत्वों को संभालने के लिए अधिक नियंत्रण प्रदान करता है।


1
क्या आप इस बारे में कुछ स्पष्टीकरण जोड़ सकते हैं कि क्यों argsort () को लागू करने से दो बार हमें रैंक मिलती है?
फणी

1
@Phani: argsortसॉर्ट किए गए सरणी के सूचकांकों को लौटाता है। क्रमबद्ध सूचकांकों का सूचकांक रैंक है। यह दूसरी कॉल argsortरिटर्न है।
अनटुब

2
पहला आर्सर्ट एक क्रमचय देता है (जो यदि डेटा पर लागू होता है तो उसे क्रमबद्ध करेगा)। जब यह (या कोई) क्रमपरिवर्तन करने के लिए argsort लागू किया जाता है, तो यह उलटा क्रमपरिवर्तन लौटाता है (कि यदि 2 क्रमांकन एक दूसरे के लिए लागू किए जाते हैं, तो परिणाम पहचान है)। दूसरे क्रमपरिवर्तन को यदि सॉर्ट किए गए डेटा ऐरे पर लागू किया जाता है, तो वह अनसोल्ड डेटा ऐरे को उत्पन्न करेगा, अर्थात यह रैंक है।
एलेक्स सी

1
होश उड़ जाना। मैं आखिरकार समझ गया! यह एक सरणी देता है जिसकी सामग्री क्रमबद्ध क्रम में मूल सरणी के सूचक हैं।
जोस ए

3

जैसा कि प्रलेखन कहता है argsort:

एक सरणी को सॉर्ट करने वाले सूचकांकों को लौटाता है।

इसका मतलब है कि आर्ग्सॉर्ट का पहला तत्व उस तत्व का सूचकांक है जिसे पहले क्रमबद्ध किया जाना चाहिए, दूसरा तत्व उस तत्व का सूचकांक है जिसे दूसरा होना चाहिए, आदि।

आप जो चाहते हैं, वह मूल्यों का रैंक क्रम है, जो कि प्रदान करता है scipy.stats.rankdata। ध्यान दें कि आपको यह सोचने की ज़रूरत है कि यदि रैंकों में संबंध हैं तो क्या होना चाहिए।


3

numpy.argsort (ए, अक्ष = -1, तरह = 'क्विकसॉर्ट', ऑर्डर = कोई नहीं)

एक सरणी को सॉर्ट करने वाले सूचकांकों को लौटाता है

दिए गए अक्ष के साथ एक अप्रत्यक्ष प्रकार का प्रदर्शन करें जो कि एक प्रकार के कीवर्ड द्वारा निर्दिष्ट एल्गोरिदम का उपयोग करता है। यह क्रमबद्ध क्रम में दिए गए अक्ष के साथ सूचकांक डेटा के समान आकार के सूचकांकों की एक सरणी देता है।

मानों की एक सूची के रूप में, अजगर में एक उदाहरण पर विचार करें

listExample  = [0 , 2, 2456,  2000, 5000, 0, 1]

अब हम argsort फ़ंक्शन का उपयोग करते हैं:

import numpy as np
list(np.argsort(listExample))

आउटपुट होगा

[0, 5, 6, 1, 3, 2, 4]

यह सूची में मूल्यों के सूचकांकों की सूची है। यदि आप इन सूचकांकों को संबंधित मानों में मैप करते हैं तो हमें निम्न परिणाम प्राप्त होंगे:

[0, 0, 1, 2, 2000, 2456, 5000]

(मुझे यह फ़ंक्शन कई जगहों पर बहुत उपयोगी लगता है। उदाहरण के लिए यदि आप सूची / सरणी को क्रमबद्ध करना चाहते हैं, लेकिन सूची का उपयोग नहीं करना चाहते हैं। तो () फ़ंक्शन (सूची में वास्तविक मानों के क्रम को बदले बिना) आप इसका उपयोग कर सकते हैं समारोह।)

अधिक जानकारी के लिए इस लिंक को देखें: https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.argsort.html


1

इनपुट:
एनपी
x = np.array ([1.48,1.41,0.0,0.1]]
x.argsort ()। argsort () के रूप में आयात करें ।

आउटपुट:
सरणी ([3, 2, 0, 1])


1
हालांकि यह कोड स्निपेट समाधान हो सकता है, जिसमें स्पष्टीकरण भी शामिल है , जो आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
2:18 बजे मोर

0

सबसे पहले, यह सरणी का आदेश दिया गया था। फिर सरणी के प्रारंभिक सूचकांक के साथ एक सरणी उत्पन्न करते हैं।


0

np.argsort 'तरह' द्वारा दिए गए सॉर्ट किए गए एरे के इंडेक्स को लौटाता है (जो सॉर्टिंग एल्गोरिदम के प्रकार को निर्दिष्ट करता है)। हालाँकि, जब np.argmax के साथ किसी सूची का उपयोग किया जाता है, तो यह सूची में सबसे बड़े तत्व का सूचकांक लौटाता है। जबकि, np.sort, दिए गए एरे को लिस्ट करता है।


0

कोड के साथ वास्तविक कार्यान्वयन के खिलाफ ओपी की मूल समझ को सीधे विपरीत करना चाहते हैं।

numpy.argsort 1D सरणियों के लिए इस तरह परिभाषित किया गया है:

x[x.argsort()] == numpy.sort(x) # this will be an array of True's

ओपी ने मूल रूप से सोचा था कि यह 1D सरणियों के लिए इस तरह परिभाषित किया गया था:

x == numpy.sort(x)[x.argsort()] # this will not be True

नोट: यह कोड सामान्य स्थिति में काम नहीं करता है (केवल 1D के लिए काम करता है), यह उत्तर विशुद्ध रूप से चित्रण प्रयोजनों के लिए है।


x[x.argsort()]जरूरी नहीं के रूप में ही है np.sort(x)। वास्तव में, यह जरूरी नहीं कि समान आकार भी हो। इसे 2 डी सरणी के साथ आज़माएं। यह केवल 1D सरणियों के साथ काम करने के लिए होता है।
नाथन

मुझे ऐसा लगता है कि यह अनावश्यक रूप से पांडित्य है। सवाल 1D सरणियों के बारे में है। यह समझने के तरीके के रूप में है कि अंतर क्या था, बल्कि शाब्दिक कोड का उपयोग करने के लिए। इसके अतिरिक्त, जब आपके पास 2 डी सरणी होती है, तो यह भी स्पष्ट नहीं होता है कि आपको किस प्रकार की छंटनी चाहिए। क्या आप एक वैश्विक प्रकार चाहते हैं? यदि नहीं, तो किस अक्ष को छांटना चाहिए? भले ही, मैंने एक अस्वीकरण जोड़ा है।
मल्टीहंटर

0

यह दिए गए सरणी सूचकांकों के अनुसार सूचकांक लौटाता है [1.48,1.41,0.0,0.1], जिसका अर्थ है: 0.0सूचकांक में पहला तत्व है, [2]। 0.1सूचकांक में दूसरा तत्व है, [3]। 1.41सूचकांक में तीसरा तत्व है, [1]। 1.48सूचकांक में चौथा तत्व है, [0]। आउटपुट:

[2,3,1,0]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.