নম্পি আর্গসোর্ট - এটি কি করছে?


123

কেন নিষ্প্রভ এই ফলাফল দিচ্ছে:

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

>[2 3 1 0]

যখন আমি এটি করার এটি আশা করতাম:

[3 2 0 1]

স্পষ্টতই আমার ফাংশন সম্পর্কে বোঝার অভাব রয়েছে।


6
আপনি কেন ভেবেছিলেন [3 2 0 1]সঠিক উত্তর হবে?
zwol

9
আমি আউটপুট সম্পর্কে একটি বিপরীত বোঝাপড়া ছিল। অর্থাৎ, আপনি যদি x এর প্রথম উপাদানটি গ্রহণ করেন তবে এটি একটি সাজানো অ্যারে এবং 3 এর মতো অবস্থানে থাকা উচিত।
ব্যবহারকারী 1276273

26
আপনার চিন্তাভাবনাটি পুরোপুরি
অর্থবোধ

2
[3 2 0 1] - এটি মানগুলি র‌্যাঙ্কিং করছে, আপনি প্রকৃত সূচকগুলি পাচ্ছেন না।
লাহিরু করুণারতনে

কেবল মনে রাখতে হবে আউটপুটটি মূল অ্যারেতে অবস্থানগুলি নির্দেশ করে যখন আপনি এটি সাজানো অ্যারেতে ভাবেন। তার অর্থ আউটপুট [0] হ'ল সূচকটি যেখানে মূল ইনপুট অ্যারে লোকেটের মধ্যে সবচেয়ে ছোট উপাদান এবং আউটপুট [-1] বৃহত্তম উপাদানের জন্য।
লিংক

উত্তর:


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 হয় 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সমান মানের উপাদানগুলি কীভাবে পরিচালনা করতে পারে তার উপর আপনাকে আরও নিয়ন্ত্রণ দেয়।


1
দুইবার আর্গোর্ট () প্রয়োগ করার কারণে কেন আমাদের র‌্যাঙ্ক দেওয়া হয় সে সম্পর্কে আপনি কিছু ব্যাখ্যা যোগ করতে পারেন?
ফানি

1
@ ফানি: argsortসাজানো অ্যারের সূচকগুলি ফেরত দেয়। বাছাই করা সূচকের সূচকটি হল র‌্যাঙ্ক। এটিই দ্বিতীয় কলটি argsortফিরে আসে।
unutbu

2
প্রথম আরগসর্ট একটি ক্রম ফেরত দেয় (যা যদি ডেটা প্রয়োগ করা হয় তবে এটি সাজান)। যখন আর্গসোর্টটি (এটি বা কোনও) ক্রমুতে প্রয়োগ করা হয়, তখন এটি বিপরীত অনুমান দেয় (যদি 2 আদেশগুলি একে অপরের সাথে প্রয়োগ করা হয় তবে ফলাফলটি পরিচয়। যদি সাজানো ডেটা অ্যারে প্রয়োগ করা হয় তবে দ্বিতীয় ক্রমটিটি অরসেটেড ডেটা অ্যারে তৈরি করবে, অর্থাৎ এটি র‌্যাঙ্ক।
অ্যালেক্স সি

1
মন ফুঁকছে। অবশেষে বুঝলাম! এটি এমন একটি অ্যারে প্রদান করে যার বিষয়বস্তু একটি সাজানো ক্রমে মূল অ্যারের সূচক।
জোসে এ

3

নথি যেমন বলেছে argsort:

সূচিগুলি সরবরাহ করে যা একটি অ্যারে বাছাই করবে।

তার মানে আর্গসোর্টের প্রথম উপাদানটি সেই উপাদানটির সূচক যা প্রথমে বাছাই করা উচিত, দ্বিতীয় উপাদানটি সেই উপাদানটির সূচক যা দ্বিতীয় হওয়া উচিত second

আপনি যা দেখতে চান তা হ'ল মানগুলির র‌্যাঙ্ক ক্রম, যা সরবরাহ করে scipy.stats.rankdata। মনে রাখবেন যে, যদি র‌্যাঙ্কগুলিতে সম্পর্ক থাকে তবে কী ঘটবে তা নিয়ে আপনার চিন্তা করা দরকার।


3

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


1

ইনপুট:
np
x = np.array হিসাবে [[1.79,1.41,0.0,0.1])
x.argsort ()। argsort () হিসাবে নম্পতি আমদানি করুন

আউটপুট:
অ্যারে ([3, 2, 0, 1])


1
যদিও এই কোড স্নিপেট একটি সমাধান সহ সমাধান হতে পারে, সত্যিই আপনার পোস্টের গুণমান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।
টাইপ

0

প্রথমে এটি অ্যারে অর্ডার করা হয়েছিল। তারপরে অ্যারের প্রাথমিক সূচক সহ একটি অ্যারে তৈরি করুন।


0

np.argsort 'ধরণের' দ্বারা প্রদত্ত বাছাই করা অ্যারের সূচকটি প্রদান করে (যা সাজানোর অ্যালগরিদমের ধরণ নির্দিষ্ট করে)। যাইহোক, যখন কোনও তালিকা এনপি.আরগম্যাক্সের সাথে ব্যবহৃত হয়, তখন এটি তালিকার বৃহত্তম উপাদানটির সূচকটি প্রদান করে। যখন, 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 অ্যারে নিয়ে কাজ করতে ঘটে।
নাথান

আমার মনে হচ্ছে এটি অযথা পেডেন্টিক। প্রশ্নটি 1 ডি অ্যারে সম্পর্কে। আক্ষরিক কোডটি ব্যবহারের পরিবর্তে পার্থক্যটি কী তা বোঝার উপায় হিসাবে এটিই উদ্দেশ্য। অতিরিক্তভাবে, আপনার কাছে যখন 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]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.