सुन्न क्यों है यह परिणाम दे रहा है:
x = numpy.array([1.48,1.41,0.0,0.1])
print x.argsort()
>[2 3 1 0]
जब मैं यह करने की उम्मीद करूँगा:
[३ २ ० १]
स्पष्ट रूप से फ़ंक्शन के बारे में मेरी समझ में कमी है।
सुन्न क्यों है यह परिणाम दे रहा है:
x = numpy.array([1.48,1.41,0.0,0.1])
print x.argsort()
>[2 3 1 0]
जब मैं यह करने की उम्मीद करूँगा:
[३ २ ० १]
स्पष्ट रूप से फ़ंक्शन के बारे में मेरी समझ में कमी है।
जवाबों:
प्रलेखन के अनुसार
एक सरणी को सॉर्ट करने वाले सूचकांकों को लौटाता है।
2
का सूचकांक है 0.0
।3
का सूचकांक है 0.1
।1
का सूचकांक है 1.41
।0
का सूचकांक है 1.48
।a = x.argsort()
, प्रिंट x[a]
, हम प्राप्त करेंगेarray([ 0. , 0.1 , 1.41, 1.48])
[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
आपको समान मूल्य के तत्वों को संभालने के लिए अधिक नियंत्रण प्रदान करता है।
argsort
सॉर्ट किए गए सरणी के सूचकांकों को लौटाता है। क्रमबद्ध सूचकांकों का सूचकांक रैंक है। यह दूसरी कॉल argsort
रिटर्न है।
जैसा कि प्रलेखन कहता है argsort
:
एक सरणी को सॉर्ट करने वाले सूचकांकों को लौटाता है।
इसका मतलब है कि आर्ग्सॉर्ट का पहला तत्व उस तत्व का सूचकांक है जिसे पहले क्रमबद्ध किया जाना चाहिए, दूसरा तत्व उस तत्व का सूचकांक है जिसे दूसरा होना चाहिए, आदि।
आप जो चाहते हैं, वह मूल्यों का रैंक क्रम है, जो कि प्रदान करता है scipy.stats.rankdata
। ध्यान दें कि आपको यह सोचने की ज़रूरत है कि यदि रैंकों में संबंध हैं तो क्या होना चाहिए।
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
इनपुट:
एनपी
x = np.array ([1.48,1.41,0.0,0.1]]
x.argsort ()। argsort () के रूप में आयात करें ।
आउटपुट:
सरणी ([3, 2, 0, 1])
सबसे पहले, यह सरणी का आदेश दिया गया था। फिर सरणी के प्रारंभिक सूचकांक के साथ एक सरणी उत्पन्न करते हैं।
कोड के साथ वास्तविक कार्यान्वयन के खिलाफ ओपी की मूल समझ को सीधे विपरीत करना चाहते हैं।
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 सरणियों के साथ काम करने के लिए होता है।
[3 2 0 1]
कि सही उत्तर होगा?