اذهب إلى المحتوى
  • 0

ترتيب مصفوفة Numpy بترتيب تنازلي؟

Amer Abdallah

السؤال

لم أجد في توثيق np.sort.

لنفترض أن لدي مصفوفة رقمية عشوائية تحتوي على أعداد صحيحة، كالتالي على سبيل المثال:

>>> arr = np.random.randint(1,10, 10)    
>>> arr
array([2, 4, 7, 4, 2, 2, 7, 6, 4, 4])

إذا قمت بترتيبها، فسأحصل على ترتيب تصاعدي افتراضيًا، كالتالي:

>>> np.sort(arr)
array([2, 2, 2, 4, 4, 4, 4, 6, 7, 7])

لكني أريد أن يتم ترتيبها تنازليًا. أعلم أنه يمكنني القيام بما يلي:

reverse_order = np.sort(arr)[::-1]

ولكن هل هذا الحل الأخير فعال؟ ألا تقوم بإنشاء نسخة بترتيب تصاعدي، ثم تقوم بعكس هذه النسخة للحصول على النتيجة بترتيب معكوس؟ إذا كان هذا هو الحال بالفعل، فهل هناك بديل فعال؟ لا يبدو أن np.sort يقبل معاملات لتغيير علامة المقارنات في عملية الترتيب للحصول على الأشياء بترتيب عكسي.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

حسناً، يمكنك استخدام الدالة argsort لفرز المصفوفة، لكنها تقوم بعملية الفرز بشكل تصاعدي:

import numpy as np
array = np.array([2, 9, 7, 10, 5, 3])
a = np.sort(array)
a
# array([ 2,  3,  5,  7,  9, 10])

لذا لجعله تنازلياً، يمكنك استخدام الدالة numpy.flip عن طريق تمرير الدالة argsort لها حيث سترد لك ال indexes للقيم مرتبة بترتيب تنازلي بعد أن يتم فرزها تصاعدياً باستخدام  argsort حيث تقوم هذه الدالة بعكس ترتيب العناصر :

import numpy as np
a = np.array([2, 9, 7, 10, 5, 3])
n=3
ids = np.flip(np.argsort(a))
print(ids[0:n])
#[3 1 2]

نفس الفكرة باستخدام np.flipud:

import numpy as np
a = np.array([2, 9, 7, 10, 5, 3])
n=3
ids = np.flipud(np.argsort(a))
print(ids[0:n])
#[3 1 2]

أو يمكنك القيام بعكسها بإحدى الأشكال التالية:

# نضرب المصفوفة بسالب وبالتالي يصبح الأصغر أكبر وبالتالي نحصل على الفهرس المطلوب
np.argsort(-1*a)[:3]
#- كما ويمكن استخدام المعامل
# أي بشكل مشابه للطريقة السابقة
(-a).argsort()[:3]
# أو بالطريقة التقليدية عن طريق أخذ آخر 3 عناصر
a.argsort()[::-1][:3]

وكمقارنة:

%timeit np.flipud(np.argsort(a))[0:3]
%timeit np.flip(np.argsort(a))[0:3]
%timeit np.argsort(-1*a)[:3]
%timeit (-a).argsort()[:3]
%timeit a.argsort()[::-1][:3]
5.14 µs ± 211 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
5.29 µs ± 337 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
4.57 µs ± 127 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
1.97 µs ± 288 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
1.86 µs ± 251 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
# الطريقة الأخيرة أفضل 

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكننا ضرب المصفوفة ب -1 ونرتبها تصاعدياً ثم نضرب الناتج مجدداً ب -1 لنحصل على الناتج الصحيح..

- np.sort( -a )
# مصفوفة معكوسة
array([7, 7, 6, 4, 4, 4, 4, 2, 2, 2])

كما يمكن عكس اتجاه مصفوفة مرتبة مثلا باستخدام الدالة flip:

np.flip(np.sort(a))

للعلم:

temp[::-1].sort()   # يرتب المصفوفة الأصلية في مكانها

np.sort(temp)[::-1] # يقوم بإنشاء مصفوفة أخرى جديدة

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

نعم يمكنك ذلك، انظر المثال التالي، دعنا ننشأ المصفوفة التاليه:

array = np.array([7, 5, 3, 2, 6, 1, 4])

بعد ذلك يمكننا ترتيبها تصاعديا كالتالي:

# ترتيب تصاعدي
sorted_array = np.sort(array)
# [1, 2, 3, 4, 5, 6, 7]

او ترتيبها تنازليا كالتالي:


# ترتيب تنازلي
reverse_array = sorted_array[::-1]
# [7, 6, 5, 4, 3, 2, 1]

وبشكل عام تستخدم

np.sort(array)[::-1]

لترتيب المصفوفة بشكل تنازلي.

طريقة اخرى مختلفه هي ان تقوم بعمل مصفوفة أخرى وتقوم باضافة العناصر المرتبه  تصاعدي في المصفوفة الاولى بشكل معكوس في المصفوفة الثانية، لكن تلك الطريقة تسلتزم مجهودا اكثر وكذلك تاخذ مساحة اكبر لكنها تحافظ لنا على المصفوفة القديمة كما هي.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك استخدام ال np.argsort 

temp = np.random.randint(1,10, 10)

temp
array([5, 2, 7, 4, 4, 2, 8, 6, 4, 4])

temp[np.argsort(-temp)]

لاحظ أنه هذا الحل أسرع قليلاً نتيجة أنه لا يتم ضرب المصفوفة مرتين في السالب لعكس الإتجاه

وغذا كنت تهتم لأمر السرعة كثيراً فيعتبر الحل الأسرع نسبياً هو np.flip عن بقية الحلول

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...