Argmax ของอาร์เรย์จำนวนนับที่ส่งคืนดัชนีที่ไม่ใช่แบบแบน


99

ฉันพยายามหาดัชนีขององค์ประกอบสูงสุดในอาร์เรย์ Numpy ซึ่งสามารถทำได้โดยใช้numpy.argmax. ปัญหาของฉันคือฉันต้องการหาองค์ประกอบที่ใหญ่ที่สุดในอาร์เรย์ทั้งหมดและรับดัชนีของสิ่งนั้น

numpy.argmax สามารถใช้กับแกนเดียวซึ่งไม่ใช่สิ่งที่ฉันต้องการหรือบนอาร์เรย์แบบแบนซึ่งเป็นสิ่งที่ฉันต้องการ

ปัญหาของฉันคือการใช้numpy.argmaxกับaxis=Noneส่งคืนดัชนีแบนเมื่อฉันต้องการดัชนีหลายมิติ

ฉันสามารถใช้divmodเพื่อรับดัชนีที่ไม่แบน แต่รู้สึกน่าเกลียด มีวิธีที่ดีกว่านี้หรือไม่?

คำตอบ:



21
np.where(a==a.max())

ส่งคืนพิกัดขององค์ประกอบสูงสุด แต่ต้องแยกวิเคราะห์อาร์เรย์สองครั้ง

>>> a = np.array(((3,4,5),(0,1,2)))
>>> np.where(a==a.max())
(array([0]), array([2]))

สิ่งนี้เมื่อเปรียบเทียบกับจะargmaxส่งกลับค่าพิกัดขององค์ประกอบทั้งหมดที่เท่ากับค่าสูงสุด argmaxส่งคืนเพียงหนึ่งในนั้น ( np.ones(5).argmax()ผลตอบแทน0)


10
สิ่งนี้จะวนซ้ำอาร์เรย์สามครั้งไม่ใช่แค่สองครั้ง หนึ่งครั้งเพื่อหาค่าสูงสุดครั้งที่สองในการสร้างผลลัพธ์==และครั้งที่สามเพื่อดึงTrueค่าจากผลลัพธ์นี้ โปรดทราบว่าอาจมีมากกว่าหนึ่งรายการที่เท่ากับค่าสูงสุด
Sven Marnach

1

เพื่อให้ได้ดัชนีที่ไม่แบนของค่าสูงสุดที่เกิดขึ้นทั้งหมดคุณสามารถแก้ไขคำตอบของ eumiro เล็กน้อยโดยใช้argwhereแทนwhere:

np.argwhere(a==a.max())

>>> a = np.array([[1,2,4],[4,3,4]])
>>> np.argwhere(a==a.max())
array([[0, 2],
       [1, 0],
       [1, 2]])

มันไม่ได้ผลเนื่องจากคุณได้รับสามรอบและการสร้างเมทริกซ์ ลองนึกภาพว่าเรามีภาพขนาด 9000x7000 (A3 @ 600dpi) คุณยังคงยืนยันในโซลูชันของคุณหรือไม่?
Maksym Ganenko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.