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

في هذا البرنامج التعليمي ، ستتعلم كيفية استخدام الدالة 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 ، وهذا صحيح.

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

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

    للعثور على الفهرس الذي يحدث عنده الحد الأقصى ، يمكنك استخدام الدالة NumPy where (). حيث تُرجع (الحالة) مصفوفة من جميع الفهارس حيث يكون الشرط صحيحًا.

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

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

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

    📑 ملاحظة: NumPy حيث () الوظيفة:
    حيث تعود (الحالة ، س ، ص):

    – عناصر من x عندما يكون الشرط صحيحًا ، و
    – عناصر من y عندما يكون الشرط خطأ.

      كيفية حذف جميع رسائل iMessages من Mac أو MacBook

    لذلك ، بتسلسل الدالتين 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 إضافية. عندما نحدد معلمة المحور في استدعاء دالة 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

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

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

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

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

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

    الآن ، دعنا نسمي الدالة argmax () في المصفوفة ثنائية الأبعاد ، المصفوفة_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.

      ما هو ولماذا يجب أن تهتم؟

    للتحقق من شكل المصفوفة المسطحة للمصفوفة_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])

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

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

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

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

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

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

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

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

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

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

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

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

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

    هنا شرح مرئي:

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

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

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

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

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

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

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

    الآن ، دعنا نعيد النظر في مثال العثور على فهرس الحد الأقصى للعنصر على طول الأعمدة (المحور = 1) وقم بتعيين الخروج إلى 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'

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

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

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

    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.