কেন নিষ্প্রভ এই ফলাফল দিচ্ছে:
x = numpy.array([1.48,1.41,0.0,0.1])
print x.argsort()
>[2 3 1 0]
যখন আমি এটি করার এটি আশা করতাম:
[3 2 0 1]
স্পষ্টতই আমার ফাংশন সম্পর্কে বোঝার অভাব রয়েছে।
কেন নিষ্প্রভ এই ফলাফল দিচ্ছে:
x = numpy.array([1.48,1.41,0.0,0.1])
print x.argsort()
>[2 3 1 0]
যখন আমি এটি করার এটি আশা করতাম:
[3 2 0 1]
স্পষ্টতই আমার ফাংশন সম্পর্কে বোঝার অভাব রয়েছে।
উত্তর:
ডকুমেন্টেশন অনুযায়ী
সূচিগুলি সরবরাহ করে যা একটি অ্যারে বাছাই করবে।
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 হয় then
আছে উপায়ে একটি সংখ্যা ফলাফলের আপনি খুঁজছেন পেতে:
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))
এই আইপিথন %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
:
সূচিগুলি সরবরাহ করে যা একটি অ্যারে বাছাই করবে।
তার মানে আর্গসোর্টের প্রথম উপাদানটি সেই উপাদানটির সূচক যা প্রথমে বাছাই করা উচিত, দ্বিতীয় উপাদানটি সেই উপাদানটির সূচক যা দ্বিতীয় হওয়া উচিত second
আপনি যা দেখতে চান তা হ'ল মানগুলির র্যাঙ্ক ক্রম, যা সরবরাহ করে scipy.stats.rankdata
। মনে রাখবেন যে, যদি র্যাঙ্কগুলিতে সম্পর্ক থাকে তবে কী ঘটবে তা নিয়ে আপনার চিন্তা করা দরকার।
numpy.argsort (a, অক্ষ = -1, ধরণের = 'quicksort', অর্ডার = কিছুই নেই)
সূচিগুলি সরবরাহ করে যা একটি অ্যারে বাছাই করবে
ধরণের কীওয়ার্ড দ্বারা নির্দিষ্ট অ্যালগরিদম ব্যবহার করে প্রদত্ত অক্ষের সাথে একটি অপ্রত্যক্ষ বাছাই করুন। এটি সাজানো ক্রমানুসারে প্রদত্ত অক্ষ বরাবর সূচী ডেটা হিসাবে একই আকারের সূচকগুলির একটি অ্যারে প্রদান করে।
পাইথনের একটি উদাহরণ বিবেচনা করুন, মান হিসাবে একটি তালিকা রয়েছে
listExample = [0 , 2, 2456, 2000, 5000, 0, 1]
এখন আমরা আরর্গোর্ট ফাংশনটি ব্যবহার করি:
import numpy as np
list(np.argsort(listExample))
আউটপুট হবে
[0, 5, 6, 1, 3, 2, 4]
এটি তালিকার মূল্যবোধের সূচকগুলির তালিকা উদাহরণ হিসাবে আপনি যদি এই সূচকগুলি সংশ্লিষ্ট মানগুলিতে ম্যাপ করেন তবে আমরা ফলাফলটি নীচের হিসাবে পেয়ে যাব:
[0, 0, 1, 2, 2000, 2456, 5000]
(আমি এই ফাংশনটি অনেক জায়গায় খুব দরকারী বলে মনে করি যেমন আপনি যদি তালিকাটি / অ্যারেটি বাছাই করতে চান তবে list.sort () ফাংশনটি ব্যবহার করতে না চান (যেমন তালিকার আসল মানগুলির ক্রম পরিবর্তন না করে) আপনি এটি ব্যবহার করতে পারেন ফাংশন।)
আরও তথ্যের জন্য এই লিঙ্কটি দেখুন: https://docs.scipy.org/doc/numpy-1.15.0/references/generated/numpy.argsort.html
ইনপুট:
np
x = np.array হিসাবে [[1.79,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]
সঠিক উত্তর হবে?