numpy.where () คำอธิบาย / ตัวอย่างทีละขั้นตอนอย่างละเอียด [ปิด]


168

ฉันมีปัญหาในการทำความเข้าใจอย่างถูกต้องnumpy.where()แม้จะมีการอ่านเอกสาร , โพสต์นี้และโพสต์อื่น

ใครบางคนสามารถให้ตัวอย่างความเห็นทีละขั้นตอนกับ 1D และ 2D อาร์เรย์?

คำตอบ:


271

หลังจากเล่นไปสักพักหนึ่งฉันก็หาสิ่งต่าง ๆ ออกมาและโพสต์ข้อความไว้ที่นี่โดยหวังว่ามันจะช่วยผู้อื่น

สังหรณ์ใจnp.whereเป็นเหมือนการถามว่า " บอกฉันทีว่าในแถวนี้รายการอะไรที่ตรงตามเงื่อนไขที่กำหนด "

>>> a = np.arange(5,10)
>>> np.where(a < 8)       # tell me where in a, entries are < 8
(array([0, 1, 2]),)       # answer: entries indexed by 0, 1, 2

นอกจากนี้ยังสามารถใช้เพื่อรับรายการในอาร์เรย์ที่ตรงตามเงื่อนไข:

>>> a[np.where(a < 8)] 
array([5, 6, 7])          # selects from a entries 0, 1, 2

เมื่อaใดที่เป็นอาร์เรย์ 2 มิติnp.where()จะส่งคืนอาร์เรย์ของแถว idx และอาร์เรย์ของคอลัมน์ idx:

>>> a = np.arange(4,10).reshape(2,3)
array([[4, 5, 6],
       [7, 8, 9]])
>>> np.where(a > 8)
(array(1), array(2))

เช่นเดียวกับในกรณี 1d เราสามารถใช้np.where()รับรายการในอาร์เรย์ 2d ที่ตรงตามเงื่อนไข:

>>> a[np.where(a > 8)] # selects from a entries 0, 1, 2

อาร์เรย์ ([9])


หมายเหตุเมื่อaเป็น 1d np.where()ยังคงส่งกลับอาร์เรย์ของแถว idx และอาร์เรย์ของคอลัมน์ idx แต่คอลัมน์มีความยาว 1 ดังนั้นหลังจึงเป็นอาร์เรย์ว่าง


10
ฉันพยายามทำความเข้าใจ np.where เมื่อใช้กับ 2d จนกระทั่งฉันพบคำตอบของคุณ "เมื่อ a คืออาร์เรย์ 2d np.where () จะส่งคืนอาร์เรย์ของ idx ของแถวและแถวของคอลัมน์ idx:" ขอบคุณสำหรับสิ่งนั้น
bencampbell_14

1
ฉันรู้สึกงี่เง่าหลังจากอ่าน doc สามครั้งและยังไม่แก้ไขปริศนาnp.where(2d_array)ขอบคุณสำหรับการเคลียร์สิ่งนี้! คุณควรยอมรับคำตอบของคุณเอง e: โอ้มันปิดแล้ว มันไม่ควรจะเป็น
smcs

5
มันเป็นความอัปยศที่ถูกปิด อย่างไรก็ตามฉันต้องการเพิ่มคุณสมบัติอื่นnp.whereให้กับคำตอบที่สมบูรณ์แบบนี้ ฟังก์ชั่นยังสามารถเลือกองค์ประกอบจากอาร์เรย์ x และ y ขึ้นอยู่กับเงื่อนไข พื้นที่ จำกัด ในความคิดเห็นนี้ แต่เห็น: จะกลับมาnp.where(np.array([[False,False,True], [True,False,False]]), np.array([[8,2,6], [9,5,0]]), np.array([[4,8,7], [3,2,1]])) array([[4, 8, 6], [9, 2, 1]])สังเกตุว่าองค์ประกอบใดของ x และ y ที่ถูกเลือกขึ้นอยู่กับจริง / เท็จ
piccolo

คำอธิบายที่ให้ไว้ในคำตอบนี้เป็นเพียงกรณีพิเศษของ np.where ตามเอกสารเมื่อมีเพียงมีให้ฟังก์ชั่นนี้เป็นชวเลขเป็นcondition np.asarray(condition).nonzero()
เลนนี่

19

นี่คือความสนุกอีกเล็กน้อย ฉันพบว่าบ่อยครั้งที่ NumPy ทำสิ่งที่ฉันต้องการอย่างแน่นอน - บางครั้งมันเร็วกว่าที่ฉันจะลองทำมากกว่าที่จะอ่านเอกสาร จริงๆแล้วส่วนผสมของทั้งสองอย่างดีที่สุด

ฉันคิดว่าคำตอบของคุณใช้ได้ (และก็ยินดีที่จะยอมรับถ้าคุณต้องการ) นี่เป็นเพียง "พิเศษ"

import numpy as np

a = np.arange(4,10).reshape(2,3)

wh = np.where(a>7)
gt = a>7
x  = np.where(gt)

print "wh: ", wh
print "gt: ", gt
print "x:  ", x

ให้:

wh:  (array([1, 1]), array([1, 2]))
gt:  [[False False False]
      [False  True  True]]
x:   (array([1, 1]), array([1, 2]))

... แต่:

print "a[wh]: ", a[wh]
print "a[gt]  ", a[gt]
print "a[x]:  ", a[x]

ให้:

a[wh]:  [8 9]
a[gt]   [8 9]
a[x]:   [8 9]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.