Πώς να χρησιμοποιήσετε τη συνάρτηση NumPy argmax() στην Python

Σε αυτό το σεμινάριο, θα μάθετε πώς να χρησιμοποιείτε τη συνάρτηση NumPy argmax() για να βρείτε το δείκτη του μέγιστου στοιχείου σε πίνακες.

Η NumPy είναι μια ισχυρή βιβλιοθήκη για επιστημονικούς υπολογισμούς στην Python. Παρέχει πίνακες Ν-διάστάσεων που είναι πιο αποδοτικοί από τις λίστες Python. Μία από τις κοινές λειτουργίες που θα εκτελείτε όταν εργάζεστε με πίνακες 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, η μέγιστη τιμή 10 εμφανίζεται στο ευρετήριο 4, μετά από μηδενική ευρετηρίαση. Το πρώτο στοιχείο βρίσκεται στο δείκτη 0. το δεύτερο στοιχείο βρίσκεται στον δείκτη 1 και ούτω καθεξής.

    Για να βρείτε το ευρετήριο στο οποίο εμφανίζεται το μέγιστο, μπορείτε να χρησιμοποιήσετε τη συνάρτηση NumPy where(). Το np.where(condition) επιστρέφει έναν πίνακα όλων των δεικτών όπου η συνθήκη είναι True.

    Θα πρέπει να πατήσετε στον πίνακα και να αποκτήσετε πρόσβαση στο στοιχείο στο πρώτο ευρετήριο. Για να βρούμε πού εμφανίζεται η μέγιστη τιμή, ορίζουμε τη συνθήκη σε array_1==10; θυμηθείτε ότι το 10 είναι η μέγιστη τιμή στον πίνακα_1.

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

    Χρησιμοποιήσαμε το np.where() μόνο με την συνθήκη, αλλά αυτή δεν είναι η προτεινόμενη μέθοδος για τη χρήση αυτής της συνάρτησης.

      Πώς να απενεργοποιήσετε ή να προσαρμόσετε τις ειδοποιήσεις Xbox One

    📑 Σημείωση: Λειτουργία NumPy where():
    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().

    Σημείωση: Από την έκδοση NumPy 1.22.0, υπάρχει μια πρόσθετη παράμετρος keepdims. Όταν καθορίζουμε την παράμετρο άξονα στην κλήση της συνάρτησης argmax(), ο πίνακας μειώνεται κατά μήκος αυτού του άξονα. Αλλά η ρύθμιση της παραμέτρου keepdims σε True διασφαλίζει ότι η επιστρεφόμενη έξοδος έχει το ίδιο σχήμα με τον πίνακα εισόδου.

    Χρησιμοποιώντας το NumPy argmax() για να βρείτε το ευρετήριο του μέγιστου στοιχείου

    #1. Ας χρησιμοποιήσουμε τη συνάρτηση NumPy argmax() για να βρούμε τον δείκτη του μέγιστου στοιχείου στον πίνακα_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() για να βρείτε το ευρετήριο του μέγιστου στοιχείου σε έναν πίνακα 2D

    Ας διαμορφώσουμε ξανά τον πίνακα 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() στον δισδιάστατο πίνακα, array_2.

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

    Παρόλο που καλέσαμε την argmax() στον δισδιάστατο πίνακα, εξακολουθεί να επιστρέφει 4. Αυτό είναι πανομοιότυπο με την έξοδο για τον μονοδιάστατο πίνακα, array_1 από την προηγούμενη ενότητα.

      Τα 13 καλύτερα ποδήλατα κάτω από το γραφείο για το γραφείο του σπιτιού σας, για να είστε υγιείς

    Γιατί συμβαίνει αυτό; 🤔

    Αυτό συμβαίνει επειδή δεν έχουμε καθορίσει καμία τιμή για την παράμετρο άξονα. Όταν αυτή η παράμετρος άξονα δεν έχει οριστεί, από προεπιλογή, η συνάρτηση argmax() επιστρέφει τον δείκτη του μέγιστου στοιχείου κατά μήκος του πεπλατυσμένου πίνακα.

    Τι είναι ένας πεπλατυσμένος πίνακας; Εάν υπάρχει ένας N-διάστατος πίνακας σχήματος d1 x d2 x … x dN, όπου d1, d2, έως και dN είναι τα μεγέθη του πίνακα κατά μήκος των διαστάσεων Ν, τότε ο πεπλατυσμένος πίνακας είναι ένας μακρύς μονοδιάστατος πίνακας μεγέθους 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])

    Αυτή η έξοδος μπορεί να είναι λίγο δύσκολο να κατανοηθεί, αλλά θα καταλάβουμε πώς λειτουργεί.

    Ορίσαμε την παράμετρο άξονα στο μηδέν (άξονας = 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 για τον υπολογισμό του δείκτη του μέγιστου στοιχείου κατά μήκος των στηλών.

      Ποια καταστήματα δέχονται το Samsung Pay;

    Η συνάρτηση 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 σε out_arr που ορίσαμε παραπάνω.

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

    Βλέπουμε ότι ο διερμηνέας Python ρίχνει ένα TypeError, καθώς το out_arr είχε αρχικοποιηθεί σε μια σειρά από float από προεπιλογή.

    ---------------------------------------------------------------------------
    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, και αυτή τη φορά, εκτελείται χωρίς σφάλμα.

    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.