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

เผยแพร่แล้ว: 2022-09-14

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้ ฟังก์ชัน 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 ซึ่งถูกต้อง

สมมติว่าคุณต้องการค้นหาดัชนีที่ค่าสูงสุดเกิดขึ้นในอาร์เรย์ คุณสามารถใช้แนวทางสองขั้นตอนต่อไปนี้:

  1. ค้นหาองค์ประกอบสูงสุด
  2. ค้นหาดัชนีขององค์ประกอบสูงสุด

ใน array_1 ค่าสูงสุด 10 จะเกิดขึ้นที่ดัชนี 4 หลังจากการจัดทำดัชนีเป็นศูนย์ องค์ประกอบแรกอยู่ที่ดัชนี 0; องค์ประกอบที่สองอยู่ที่ดัชนี 1 เป็นต้น

numpy-argmax

หากต้องการค้นหาดัชนีที่เกิดค่าสูงสุด คุณสามารถใช้ฟังก์ชัน 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

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

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

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

numpy-argmax-2darray

ทีนี้มาเรียกฟังก์ชัน argmax 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.

ในการตรวจสอบว่าอาร์เรย์แบบแบนมีลักษณะอย่างไรสำหรับ 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])

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

 print(out_arr) # Output [2 0]

บทสรุป

ฉันหวังว่าบทช่วยสอนนี้จะช่วยให้คุณเข้าใจวิธีใช้ฟังก์ชัน NumPy argmax() คุณสามารถเรียกใช้ตัวอย่างโค้ดในสมุดบันทึก Jupyter

มาทบทวนสิ่งที่เราได้เรียนรู้กัน

  • ฟังก์ชัน NumPy argmax() จะคืนค่าดัชนีขององค์ประกอบสูงสุดในอาร์เรย์ หากองค์ประกอบสูงสุดเกิดขึ้นมากกว่าหนึ่งครั้งในอาร์เรย์ a ดังนั้น np.argmax(a) จะส่งกลับดัชนีของการเกิดขึ้นครั้งแรกขององค์ประกอบ
  • เมื่อทำงานกับอาร์เรย์หลายมิติ คุณสามารถใช้พารามิเตอร์ แกน ทางเลือกเพื่อรับดัชนีขององค์ประกอบสูงสุดตามแกนเฉพาะ ตัวอย่างเช่น ในอาร์เรย์สองมิติ: โดยการตั้งค่า axis = 0 และ axis = 1 คุณจะได้รับดัชนีขององค์ประกอบสูงสุดตามแถวและคอลัมน์ตามลำดับ
  • หากคุณต้องการเก็บค่าที่ส่งคืนในอาร์เรย์อื่น คุณสามารถตั้งค่าพารามิเตอร์ out ที่เป็นทางเลือกให้กับอาร์เรย์เอาต์พุตได้ อย่างไรก็ตาม อาร์เรย์เอาต์พุตควรมีรูปร่างและประเภทข้อมูลที่เข้ากันได้

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