كيفية استخدام دالة NumPy argmax () في بايثون

نشرت: 2022-09-14

في هذا البرنامج التعليمي ، ستتعلم كيفية استخدام الدالة NumPy argmax () للعثور على فهرس أقصى عنصر في المصفوفات.

NumPy هي مكتبة قوية للحوسبة العلمية في بايثون. يوفر مصفوفات ذات أبعاد N أكثر أداءً من قوائم بايثون. إحدى العمليات الشائعة التي ستنفذها عند التعامل مع مصفوفات NumPy هي إيجاد القيمة القصوى في المصفوفة. ومع ذلك ، قد ترغب أحيانًا في العثور على الفهرس الذي تظهر عنده القيمة القصوى.

تساعدك الدالة argmax() في العثور على فهرس الحد الأقصى في كل من المصفوفات أحادية البعد والمتعددة الأبعاد. دعنا ننتقل لمعرفة كيف يعمل.

كيفية البحث عن فهرس الحد الأقصى للعنصر في مصفوفة NumPy

لمتابعة هذا البرنامج التعليمي ، تحتاج إلى تثبيت Python و NumPy. يمكنك كتابة التعليمات البرمجية من خلال بدء تشغيل Python REPL أو تشغيل دفتر Jupyter.

أولاً ، دعنا نستورد NumPy تحت الاسم المستعار المعتاد np .

 import numpy as np

يمكنك استخدام الدالة NumPy max() للحصول على القيمة القصوى في المصفوفة (اختياريًا على طول محور معين).

 array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.max(array_1)) # Output 10

في هذه الحالة ، np.max(array_1) 10 ، وهذا صحيح.

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

  1. ابحث عن الحد الأقصى للعنصر.
  2. ابحث عن فهرس الحد الأقصى للعنصر.

في array_1 ، تحدث القيمة القصوى 10 في الفهرس 4 ، بعد الفهرسة الصفرية. العنصر الأول في الفهرس 0 ؛ العنصر الثاني في الفهرس 1 ، وهكذا.

numpy- أرجماكس

للعثور على الفهرس الذي يحدث عنده الحد الأقصى ، يمكنك استخدام الدالة NumPy where (). np.where(condition) بإرجاع مصفوفة من جميع الفهارس حيث يكون condition True .

سيتعين عليك النقر على المصفوفة والوصول إلى العنصر في الفهرس الأول. لمعرفة مكان حدوث القيمة القصوى ، قمنا بتعيين condition على array_1==10 ؛ تذكر أن 10 هي القيمة القصوى في array_1 .

 print(int(np.where(array_1==10)[0])) # Output 4

لقد استخدمنا np.where() مع الشرط فقط ، لكن هذه ليست الطريقة الموصى بها لاستخدام هذه الوظيفة.

ملاحظة: NumPy حيث الوظيفة () :
np.where(condition,x,y) :

- عناصر من x عندما يكون الشرط True ، و
- عناصر من y عندما يكون الشرط False .

لذلك ، بتسلسل np.max() و np.where() ، يمكننا العثور على الحد الأقصى للعنصر ، متبوعًا بالفهرس الذي يحدث فيه.

بدلاً من العملية المكونة من خطوتين أعلاه ، يمكنك استخدام الدالة NumPy argmax () للحصول على فهرس أقصى عنصر في المصفوفة.

بناء جملة الدالة NumPy argmax ()

الصيغة العامة لاستخدام الدالة NumPy argmax () هي كما يلي:

 np.argmax(array,axis,out) # we've imported numpy under the alias np

في الصيغة أعلاه:

  • المصفوفة هي أي مجموعة NumPy صالحة.
  • المحور معلمة اختيارية. عند العمل باستخدام مصفوفات متعددة الأبعاد ، يمكنك استخدام معلمة المحور للعثور على فهرس الحد الأقصى على طول محور معين.
  • out هو معلمة اختيارية أخرى. يمكنك تعيين المعلمة out إلى مصفوفة NumPy لتخزين إخراج الدالة argmax() .

ملاحظة : من الإصدار 1.22.0 من NumPy ، توجد معلمة keepdims إضافية. عندما نحدد معلمة axis في استدعاء دالة argmax() ، يتم تقليل الصفيف على طول هذا المحور. لكن تعيين معلمة keepdims إلى True يضمن أن يكون الإخراج المرتجع بنفس شكل مصفوفة الإدخال.

استخدام NumPy argmax () لإيجاد فهرس العنصر الأقصى

# 1 . دعنا نستخدم الدالة NumPy argmax () للعثور على فهرس الحد الأقصى للعنصر في array_1 .

 array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.argmax(array_1)) # Output 4

ترجع الدالة argmax() 4 ، وهذا صحيح!

# 2 . إذا أعدنا تعريف array_1 بحيث تحدث 10 مرتين ، فإن argmax() ترجع فقط فهرس التكرار الأول.

 array_1 = np.array([1,5,7,2,10,10,8,4]) print(np.argmax(array_1)) # Output 4

بالنسبة لبقية الأمثلة ، سنستخدم عناصر array_1 التي حددناها في المثال رقم 1.

استخدام NumPy argmax () لإيجاد فهرس العنصر الأقصى في صفيف ثنائي الأبعاد

دعنا نعيد تشكيل مصفوفة array_1 في مصفوفة ثنائية الأبعاد تتكون من صفين وأربعة أعمدة.

 array_2 = array_1.reshape(2,4) print(array_2) # Output [[ 1 5 7 2] [10 9 8 4]]

بالنسبة للصفيف ثنائي الأبعاد ، يشير المحور 0 إلى الصفوف ويشير المحور 1 إلى الأعمدة. مصفوفات NumPy تتبع الفهرسة الصفرية . لذا فإن مؤشرات الصفوف والأعمدة الخاصة بمصفوفة array_2 هي كما يلي:

numpy-argmax-2darray

الآن ، دعنا نسمي الدالة argmax() في المصفوفة ثنائية الأبعاد ، array_2 .

 print(np.argmax(array_2)) # Output 4

على الرغم من أننا argmax() على المصفوفة ثنائية الأبعاد ، إلا أنها لا تزال ترجع 4. وهذا مطابق لإخراج المصفوفة أحادية البعد ، array_1 من القسم السابق.

لماذا يحدث هذا؟

هذا لأننا لم نحدد أي قيمة لمعلمة المحور. عندما لا يتم تعيين معلمة المحور هذه ، بشكل افتراضي ، تُرجع الدالة argmax() فهرس الحد الأقصى للعنصر على طول الصفيف المسطح.

ما هي مصفوفة بالارض؟ إذا كان هناك مصفوفة ذات أبعاد N من الشكل d1 x d2 x… x dN ، حيث d1، d2، up to dN هي أحجام المصفوفة على طول أبعاد N ، فإن المصفوفة المسطحة تكون مصفوفة طويلة أحادية البعد من الحجم d1 * d2 *… * dN.

للتحقق من شكل المصفوفة المسطحة array_2 ، يمكنك استدعاء طريقة flatten() ، كما هو موضح أدناه:

 array_2.flatten() # Output array([ 1, 5, 7, 2, 10, 9, 8, 4])

فهرس العنصر الأقصى على طول الصفوف (المحور = 0)

دعنا ننتقل إلى العثور على فهرس أقصى عنصر على طول الصفوف (المحور = 0).

 np.argmax(array_2,axis=0) # Output array([1, 1, 1, 1])

قد يكون هذا الإخراج صعب الفهم بعض الشيء ، لكننا سوف نفهم كيف يعمل.

لقد قمنا بتعيين معلمة axis على صفر ( axis = 0 ) ، حيث نرغب في العثور على فهرس أقصى عنصر على طول الصفوف. لذلك ، تُرجع الدالة argmax() رقم الصف الذي يظهر فيه الحد الأقصى للعنصر — لكل عمود من الأعمدة الثلاثة.

دعونا نتخيل هذا لفهم أفضل.

numpy-argmax-axis0

من الرسم البياني أعلاه argmax() ، لدينا ما يلي:

  • بالنسبة للعمود الأول في الفهرس 0 ، تحدث القيمة القصوى 10 في الصف الثاني ، عند الفهرس = 1.
  • بالنسبة للعمود الثاني في الفهرس 1 ، تحدث القيمة القصوى 9 في الصف الثاني ، عند الفهرس = 1.
  • بالنسبة للعمودين الثالث والرابع في الفهرس 2 و 3 ، تحدث القيمتان القصوى 8 و 4 في الصف الثاني ، عند الفهرس = 1.

هذا هو بالضبط سبب وجود array([1, 1, 1, 1]) لأن الحد الأقصى للعنصر على طول الصفوف يحدث في الصف الثاني (لجميع الأعمدة).

فهرس العنصر الأقصى على طول الأعمدة (المحور = 1)

بعد ذلك ، دعنا نستخدم الدالة argmax() للعثور على فهرس أقصى عنصر على طول الأعمدة.

قم بتشغيل مقتطف التعليمات البرمجية التالي ولاحظ الإخراج.

 np.argmax(array_2,axis=1)
 array([2, 0])

هل يمكنك تحليل الإخراج؟

لقد حددنا axis = 1 لحساب فهرس أقصى عنصر على طول الأعمدة.

ترجع الدالة argmax() ، لكل صف ، رقم العمود الذي تحدث فيه القيمة القصوى.

هنا شرح مرئي:

numpy-argmax-axis1

من الرسم البياني أعلاه argmax() ، لدينا ما يلي:

  • بالنسبة للصف الأول في الفهرس 0 ، تحدث القيمة القصوى 7 في العمود الثالث ، عند الفهرس = 2.
  • بالنسبة للصف الثاني في الفهرس 1 ، تحدث القيمة القصوى 10 في العمود الأول ، عند الفهرس = 0.

أتمنى أن تفهم الآن ما يعنيه الإخراج ، array([2, 0]) .

استخدام معلمة الإخراج الاختيارية في NumPy argmax ()

يمكنك استخدام معلمة الإخراج الاختيارية out دالة NumPy argmax () لتخزين الإخراج في مصفوفة NumPy.

دعنا نهيئ مصفوفة من الأصفار لتخزين ناتج استدعاء الدالة argmax() السابق - للعثور على فهرس الحد الأقصى على طول الأعمدة ( axis= 1 ).

 out_arr = np.zeros((2,)) print(out_arr) [0. 0.]

الآن ، دعنا نعيد النظر في مثال العثور على فهرس الحد الأقصى للعنصر على طول الأعمدة ( axis = 1 ) وقم بتعيين out إلى out_arr الذي حددناه أعلاه.

 np.argmax(array_2,axis=1,out=out_arr)

نرى أن مترجم Python يلقي خطأ TypeError ، حيث تمت تهيئة out_arr إلى مصفوفة من العوامات افتراضيًا.

 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) /usr/local/lib/python3.7/dist-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds) 56 try: ---> 57 return bound(*args, **kwds) 58 except TypeError: TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe'

لذلك ، عند تعيين معلمة الإخراج out صفيف الإخراج ، من المهم التأكد من أن صفيف الإخراج بالشكل ونوع البيانات الصحيحين. نظرًا لأن فهارس المصفوفة هي دائمًا أعداد صحيحة ، يجب علينا تعيين معلمة dtype على int عند تعريف مصفوفة الإخراج.

 out_arr = np.zeros((2,),dtype=int) print(out_arr) # Output [0 0]

يمكننا الآن المضي قدمًا واستدعاء الدالة argmax() مع كل out معلمات axis والمخرج ، وهذه المرة ، تعمل بدون أخطاء.

 np.argmax(array_2,axis=1,out=out_arr)

يمكن الآن الوصول إلى إخراج الدالة argmax() في المصفوفة out_arr .

 print(out_arr) # Output [2 0]

استنتاج

آمل أن يساعدك هذا البرنامج التعليمي في فهم كيفية استخدام وظيفة NumPy argmax (). يمكنك تشغيل أمثلة التعليمات البرمجية في دفتر Jupyter.

دعنا نراجع ما تعلمناه.

  • ترجع الدالة NumPy argmax () فهرس الحد الأقصى للعنصر في المصفوفة. إذا ظهر الحد الأقصى للعنصر أكثر من مرة في مصفوفة a ، فإن np.argmax (a) تُرجع فهرس التواجد الأول للعنصر.
  • عند العمل باستخدام مصفوفات متعددة الأبعاد ، يمكنك استخدام معلمة المحور الاختيارية للحصول على فهرس أقصى عنصر على طول محور معين. على سبيل المثال ، في مصفوفة ثنائية الأبعاد: من خلال ضبط المحور = 0 والمحور = 1 ، يمكنك الحصول على فهرس أقصى عنصر على طول الصفوف والأعمدة ، على التوالي.
  • إذا كنت ترغب في تخزين القيمة التي تم إرجاعها في مصفوفة أخرى ، فيمكنك تعيين معلمة الإخراج الاختيارية على مصفوفة الإخراج. ومع ذلك ، يجب أن يكون صفيف الإخراج متوافقًا مع الشكل ونوع البيانات.

بعد ذلك ، تحقق من الدليل التفصيلي حول مجموعات Python.