• 0

هل من الممكن استخدام argsort بترتيب تنازلي في Numpy؟

لدي كود مشابة للتالي:

import numpy as np
avgDists = np.array([2, 9, 7, 10, 5, 3])
ids = avgDists.argsort()[:3]
print(ids)	# Output: array([0, 5, 4], dtype=int64)

هل من الممكن استخدام نفس دالة argsort بترتيب تنازلي للحصول على مؤشرات indices أعلى ثلاثة العناصر؟

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

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


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

يمكنك استخدام الدالة 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)
# الطريقة الأخيرة أفضل 

 

2 اشخاص أعجبوا بهذا

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


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

حتى نستطيع عكس الترتيب للتنازلي بواسطة argsort ربما نحتاج لعكس المصفوفة الناتجة من هذه الدالة ويمكننا عكسها كالتالي

avgDists=np.array([1, 8, 6, 9, 4])
ids = avgDists.argsort()[::-1][:3] #لعكس المصفوفة نستخدم [::-1]  
ids
array([3, 1, 2])

أو يمكننا تحويل القيم لقيم بالسالب 

import numpy as np
avgDists = np.array([2, 9, 7, 10, 5, 3])
ids = (-avgDists).argsort()[:n] #(-avgDists) لاحظ 
print(ids)

 

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

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


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

في الاصل، تستخدم argsort في ترتيب العناصر داخل مصفوفة من النوع numpy ، استخدامها بالشكل العادي يجعل الترتيب تصاعدي ، أي من الاقل للاعلى كالتالي:

avgDists = np.array([1, 8, 6, 9, 4])
ids = avgDists.argsort()[:n]

أما اذا اردت استخدامها بشكل تنازلي بحيث تكون اعلى القيم في البداية يمكن استخدام العلامة - لعكس الترتيب كالتالي:

avgDists = np.array([1, 8, 6, 9, 4])
ids = (-avgDists).argsort()[:n]

مثال أخر، أفترض ان عندنا المصفوفة التالية

[3 4 7 2]

لترتيب القيم بشكل تنازلي وارجاع اماكن index اعلى 3 قيم استخدام الطريقة التالية:


n = 3
largest_indices = np.argsort(-1*an_array)[:n]

print(largest_indices)
OUTPUT
[2 1 0]

هنا قام بارجاع [2,1,0] وهي تمثل أماكن أعلى العناصر بالترتيب وهى [7,4,3]

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


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

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

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

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


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

تسجيل الدخول

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


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