---
title: numpy where — เลือกค่าตามเงื่อนไขใน array
url: https://www.thepexcel.com/functions/python/logic/numpy-where/
type: function-explainer
program: Python
syntax: "np.where(condition, x, y)"
date: 2026-05-31
scores:
  popularity: 5
  difficulty: 3
  usefulness: 5
---

# numpy where — เลือกค่าตามเงื่อนไขใน array

> numpy.where ผมใช้เลือกค่าจาก array ตามเงื่อนไขที่กำหนดครับ ถ้าให้เทียบง่ายๆ มันคือ IF ใน Excel นั่นแ

## คำอธิบาย

numpy.where ผมใช้เลือกค่าจาก array ตามเงื่อนไขที่กำหนดครับ ถ้าให้เทียบง่ายๆ มันคือ IF ใน Excel นั่นแหละ แต่เก่งกว่าตรงที่ทำงานกับข้อมูลทั้ง array พร้อมกันในทีเดียว แถมยังใส่อาร์กิวเมนต์เดียวเพื่อหา index ที่ตรงเงื่อนไขได้อีกด้วย

## Syntax

```excel
np.where(condition, x, y)
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| condition | Yes | array_like |  | เงื่อนไขที่ให้ผลเป็น True หรือ False เช่น arr > 0 หรือ (arr > 0) & (arr < 10) |
| x | No | array_like |  | ค่าที่จะคืนเมื่อเงื่อนไขเป็น True ถ้าไม่ใส่ x และ y ฟังก์ชันจะคืน index แทน |
| y | No | array_like |  | ค่าที่จะคืนเมื่อเงื่อนไขเป็น False |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: แทนค่าลบด้วย 0

```excel
np.where(arr > 0, arr, 0)
```

**ผลลัพธ์:** `[1 0 3 0 5]`

ผมให้มันไล่เช็คทุก element ครับ ถ้าตัวไหนมากกว่า 0 ก็เก็บค่าเดิมไว้ ถ้าน้อยกว่าหรือเท่ากับ 0 ให้ใส่ 0 แทน ผลที่ได้คือ array ใหม่ [1, 0, 3, 0, 5] ที่ค่าลบทุกตัวถูกเปลี่ยนเป็น 0 หมดเลย

### 2. ตัวอย่างที่ 2: หา index ของ element ที่ตรงเงื่อนไข

```excel
np.where(arr2 > 7)
```

**ผลลัพธ์:** `(array([0, 2, 4]),)`

พอใส่อาร์กิวเมนต์เดียว np.where จะเปลี่ยนโหมดมาคืน index ตำแหน่งที่เงื่อนไขเป็นจริงให้แทนครับ ในที่นี้ค่าที่มากกว่า 7 คือ 10 (อยู่ index 0), 8 (index 2) และ 12 (index 4) ก็เลยได้ผลเป็น [0, 2, 4]

### 3. ตัวอย่างที่ 3: เงื่อนไขหลายชั้นแบบ nested IF สำหรับให้เกรด

```excel
np.where(scores >= 80, 'A', np.where(scores >= 70, 'B', 'C'))
```

**ผลลัพธ์:** `['C' 'B' 'C' 'A' 'C']`

อันนี้คือลูกเล่นที่ผมชอบครับ ซ้อน np.where สองชั้นเพื่อให้เกรด ชั้นนอกเช็คว่าคะแนน >= 80 ไหม ถ้าใช่ได้ A เลย ถ้าไม่ใช่ก็ส่งต่อให้ชั้นในเช็คอีกทีว่า >= 70 ไหม ใช่ได้ B ไม่ใช่ได้ C ผลออกมาคือ [C, B, C, A, C] ตรงตามคะแนนทุกตัว

## หมายเหตุเพิ่มเติม

- 💡 ระวังเรื่อง dtype ตอนผสม string กับตัวเลขใน x, y นะครับ เช่น np.where(cond, 1, 'zero') numpy จะแอบแปลงทุกอย่างเป็น string ให้อัตโนมัติ ตรงนี้พลาดกันบ่อยมาก

- ถ้าข้อมูลใหญ่มากๆ np.where เร็วกว่า list comprehension หลายสิบเท่าเลยครับ เพราะมันทำงานในภาษา C และไม่ต้องสร้าง Python object ทีละตัว ผมเลยใช้ตัวนี้เป็นหลักเวลาเจอข้อมูลเยอะ

## คำถามที่พบบ่อย

**Q: ต่างจาก boolean indexing ยังไง?**

ต่างกันที่ขนาดผลลัพธ์ครับ boolean indexing อย่าง arr[arr > 0] จะกรองเอาเฉพาะค่าที่ตรงเงื่อนไขออกมา ขนาด array เลยเปลี่ยน (สั้นลง) แต่ np.where(cond, x, y) คืน array ขนาดเท่าเดิมเสมอ แค่แทนค่าแต่ละตัวด้วย x หรือ y ตามเงื่อนไข ผมเลยเลือก np.where เวลาอยากรักษาตำแหน่งข้อมูลให้เท่าเดิมครับ

**Q: ใช้กับ pandas DataFrame ได้ไหม?**

ได้ครับ จริงๆ pandas มีเมธอด .where() และ .mask() ในตัวที่ทำงานคล้ายกันอยู่แล้ว แต่ถ้าอยากใช้ np.where กับ Series ก็จัดได้เลย ผลที่ได้จะเป็น ndarray ซึ่งเอามาแปลงกลับเป็น Series ต่อได้ไม่มีปัญหา

## แหล่งข้อมูลเพิ่มเติม

- [numpy.where — NumPy official documentation](https://numpy.org/doc/stable/reference/generated/numpy.where.html) _(article)_

---

_Source: [https://www.thepexcel.com/functions/python/logic/numpy-where/](https://www.thepexcel.com/functions/python/logic/numpy-where/)_
