วิธีใช้ฟังก์ชัน NumPy argmax() ใน Python

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้ฟังก์ชัน NumPy argmax() เพื่อค้นหาดัชนีขององค์ประกอบสูงสุดในอาร์เรย์

NumPy เป็นห้องสมุดที่ทรงพลังสำหรับการคำนวณทางวิทยาศาสตร์ใน Python; มันจัดเตรียมอาร์เรย์ N- มิติที่มีประสิทธิภาพมากกว่ารายการ Python หนึ่งในการดำเนินการทั่วไปที่คุณจะทำเมื่อทำงานกับอาร์เรย์ NumPy คือการหาค่าสูงสุดในอาร์เรย์ อย่างไรก็ตาม บางครั้งคุณอาจต้องการค้นหาดัชนีที่มีค่าสูงสุดเกิดขึ้น

ฟังก์ชัน argmax() ช่วยให้คุณค้นหาดัชนีของค่าสูงสุดในอาร์เรย์ทั้งแบบหนึ่งมิติและหลายมิติ มาเรียนรู้วิธีการทำงานกันต่อ

วิธีค้นหาดัชนีขององค์ประกอบสูงสุดใน NumPy Array

ในการปฏิบัติตามบทช่วยสอนนี้ คุณต้องติดตั้ง 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() np.where(condition) ส่งคืนอาร์เรย์ของดัชนีทั้งหมดที่เงื่อนไขเป็น True

    คุณจะต้องแตะเข้าไปในอาร์เรย์และเข้าถึงรายการที่ดัชนีแรก ในการค้นหาว่าค่าสูงสุดเกิดขึ้นที่ใด เราตั้งค่าเงื่อนไขเป็น array_1==10; จำได้ว่า 10 เป็นค่าสูงสุดใน array_1

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

    เราใช้ np.where() โดยมีเงื่อนไขเท่านั้น แต่นี่ไม่ใช่วิธีที่แนะนำให้ใช้ฟังก์ชันนี้

    📑 หมายเหตุ: NumPy where() ฟังก์ชัน:
    np.where(condition,x,y) คืนค่า:

    – องค์ประกอบจาก x เมื่อเงื่อนไขเป็นจริงและ
    – องค์ประกอบจาก y เมื่อเงื่อนไขเป็นเท็จ

    ดังนั้น เมื่อเชื่อมโยงฟังก์ชัน np.max() และ np.where() เข้าด้วยกัน เราจะสามารถค้นหาองค์ประกอบสูงสุด ตามด้วยดัชนีที่เกิดขึ้น

    แทนที่จะใช้กระบวนการสองขั้นตอนข้างต้น คุณสามารถใช้ฟังก์ชัน NumPy argmax() เพื่อรับดัชนีขององค์ประกอบสูงสุดในอาร์เรย์

      คุณจะเปลี่ยนแผน Spotify ของคุณได้อย่างไร

    ไวยากรณ์ของฟังก์ชัน NumPy argmax()

    ไวยากรณ์ทั่วไปในการใช้ฟังก์ชัน NumPy argmax() มีดังนี้:

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

    ในไวยากรณ์ข้างต้น:

    • array เป็นอาร์เรย์ NumPy ที่ถูกต้อง
    • แกนเป็นพารามิเตอร์ทางเลือก เมื่อทำงานกับอาร์เรย์หลายมิติ คุณสามารถใช้พารามิเตอร์แกนเพื่อค้นหาดัชนีค่าสูงสุดตามแกนที่ระบุได้
    • out เป็นพารามิเตอร์ทางเลือกอื่น คุณสามารถตั้งค่าพารามิเตอร์ out เป็นอาร์เรย์ NumPy เพื่อเก็บเอาต์พุตของฟังก์ชัน argmax()

    หมายเหตุ: จาก NumPy เวอร์ชัน 1.22.0 มีพารามิเตอร์ 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

    สำหรับตัวอย่างที่เหลือ เราจะใช้องค์ประกอบของ array_1 ที่เรากำหนดไว้ในตัวอย่างที่ 1

    การใช้ NumPy argmax() เพื่อค้นหาดัชนีขององค์ประกอบสูงสุดในอาร์เรย์ 2 มิติ

    มาเปลี่ยนรูปแบบ NumPy array 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 จากส่วนก่อนหน้า

    ทำไมสิ่งนี้ถึงเกิดขึ้น? 🤔

    เนื่องจากเราไม่ได้ระบุค่าใดๆ สำหรับพารามิเตอร์แกน เมื่อไม่ได้ตั้งค่าพารามิเตอร์แกนนี้ โดยค่าเริ่มต้น ฟังก์ชัน argmax() จะส่งกลับดัชนีขององค์ประกอบสูงสุดตามอาร์เรย์ที่แบนราบ

    อาร์เรย์แบบแบนคืออะไร? หากมีอาร์เรย์ N- มิติของรูปร่าง d1 x d2 x … x dN โดยที่ d1, d2 ถึง dN คือขนาดของอาร์เรย์ตามมิติ N ดังนั้นอาร์เรย์ที่แบนแล้วจะเป็นอาร์เรย์หนึ่งมิติที่ยาว d1 * d2 * … * dN.

      วิธีแก้ไขแอพที่ขัดข้องบน iPhone หรือ iPad

    ในการตรวจสอบว่าอาร์เรย์แบบแบนมีลักษณะอย่างไรสำหรับ 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 เพื่อคำนวณดัชนีขององค์ประกอบสูงสุดตามคอลัมน์

    ฟังก์ชัน argmax() ส่งกลับ สำหรับแต่ละแถว หมายเลขคอลัมน์ที่เกิดค่าสูงสุด

    นี่คือคำอธิบายภาพ:

    จากไดอะแกรมด้านบนและเอาต์พุต argmax() เรามีดังต่อไปนี้:

    • สำหรับแถวแรกที่ดัชนี 0 ค่าสูงสุด 7 เกิดขึ้นในคอลัมน์ที่สาม ที่ดัชนี = 2
    • สำหรับแถวที่สองที่ดัชนี 1 ค่าสูงสุด 10 เกิดขึ้นในคอลัมน์แรก ที่ดัชนี = 0

    ฉันหวังว่าคุณจะเข้าใจสิ่งที่ส่งออก, array([2, 0]) วิธี.

    การใช้พารามิเตอร์ Optional out ใน 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 ถูกกำหนดค่าเริ่มต้นเป็นอาร์เรย์ของ floats โดยค่าเริ่มต้น

    ---------------------------------------------------------------------------
    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() กับทั้งพารามิเตอร์ axis และ 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) จะส่งกลับดัชนีของการเกิดขึ้นครั้งแรกขององค์ประกอบ
    • เมื่อทำงานกับอาร์เรย์หลายมิติ คุณสามารถใช้พารามิเตอร์แกนทางเลือกเพื่อรับดัชนีขององค์ประกอบสูงสุดตามแกนเฉพาะ ตัวอย่างเช่น ในอาร์เรย์สองมิติ: โดยการตั้งค่า axis = 0 และ axis = 1 คุณจะได้รับดัชนีขององค์ประกอบสูงสุดตามแถวและคอลัมน์ตามลำดับ
    • หากคุณต้องการเก็บค่าที่ส่งคืนในอาร์เรย์อื่น คุณสามารถตั้งค่าพารามิเตอร์ out ที่เป็นทางเลือกให้กับอาร์เรย์เอาต์พุตได้ อย่างไรก็ตาม อาร์เรย์เอาต์พุตควรมีรูปร่างและประเภทข้อมูลที่เข้ากันได้

    ต่อไป ดูคำแนะนำเชิงลึกเกี่ยวกับชุด Python

    เรื่องล่าสุด

    x