• 0

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

لم أجد في توثيق 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 يقبل معاملات لتغيير علامة المقارنات في عملية الترتيب للحصول على الأشياء بترتيب عكسي.

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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] # يقوم بإنشاء مصفوفة أخرى جديدة

 

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]

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

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

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 عن بقية الحلول

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


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

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن