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

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

Amer Abdallah

السؤال

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

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 أعلى ثلاثة العناصر؟

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

Recommended Posts

  • 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)
# الطريقة الأخيرة أفضل 

 

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

  • 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)

 

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

  • 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]

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...