numpy.where ผมใช้เลือกค่าจาก array ตามเงื่อนไขที่กำหนดครับ ถ้าให้เทียบง่ายๆ มันคือ IF ใน Excel นั่นแหละ แต่เก่งกว่าตรงที่ทำงานกับข้อมูลทั้ง array พร้อมกันในทีเดียว แถมยังใส่อาร์กิวเมนต์เดียวเพื่อหา index ที่ตรงเงื่อนไขได้อีกด้วย
np.where(condition, x, y)
np.where(condition, x, y)
ndarray
คืนเป็น NumPy array ใหม่ทันทีครับ ใช้งานต่อได้เลย ไม่ต้อง chain อะไรเพิ่ม
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| condition | array_like | Yes | เงื่อนไขที่ให้ผลเป็น True หรือ False เช่น arr > 0 หรือ (arr > 0) & (arr < 10) | |
| x | array_like | Optional | ค่าที่จะคืนเมื่อเงื่อนไขเป็น True ถ้าไม่ใส่ x และ y ฟังก์ชันจะคืน index แทน | |
| y | array_like | Optional | ค่าที่จะคืนเมื่อเงื่อนไขเป็น False |
np.where(arr > 0, arr, 0)np.where(arr > 0, arr, 0)
[1 0 3 0 5]
np.where(arr2 > 7)np.where(arr2 > 7)
(array([0, 2, 4]),)
np.where(scores >= 80, 'A', np.where(scores >= 70, 'B', 'C'))np.where(scores >= 80, 'A', np.where(scores >= 70, 'B', 'C'))
['C' 'B' 'C' 'A' 'C']
ต่างกันที่ขนาดผลลัพธ์ครับ boolean indexing อย่าง arr[arr > 0] จะกรองเอาเฉพาะค่าที่ตรงเงื่อนไขออกมา ขนาด array เลยเปลี่ยน (สั้นลง) แต่ np.where(cond, x, y) คืน array ขนาดเท่าเดิมเสมอ แค่แทนค่าแต่ละตัวด้วย x หรือ y ตามเงื่อนไข ผมเลยเลือก np.where เวลาอยากรักษาตำแหน่งข้อมูลให้เท่าเดิมครับ
ได้ครับ จริงๆ pandas มีเมธอด .where() และ .mask() ในตัวที่ทำงานคล้ายกันอยู่แล้ว แต่ถ้าอยากใช้ np.where กับ Series ก็จัดได้เลย ผลที่ได้จะเป็น ndarray ซึ่งเอามาแปลงกลับเป็น Series ต่อได้ไม่มีปัญหา
numpy.where เป็นฟังก์ชันที่ผมหยิบมาใช้บ่อยมากเวลาทำงานสาย data science 😎
มันใช้ได้สองแบบครับ:
1. แบบใส่สามอาร์กิวเมนต์: np.where(condition, x, y) ถ้าเงื่อนไขจริงคืนค่า x ถ้าเท็จคืนค่า y ไล่เช็คทีละ element ทั้ง array พูดง่ายๆ คือ “จริงเอาอันนี้ เท็จเอาอันนั้น”
2. แบบใส่อาร์กิวเมนต์เดียว: np.where(condition) จะคืน index ของ element ที่เงื่อนไขเป็นจริงมาให้
ที่เจ๋งคือมันทำงานแบบ vectorized ซึ่งเร็วกว่าการเขียน for loop วนทีละตัวมากครับ แล้วถ้าเงื่อนไขมีหลายชั้น ก็ซ้อน np.where เข้าไปข้างในได้ คล้ายๆ nested IF ใน Excel เลย ✨