Data nyata menuntut keputusan per elemen: nilai ujian memenuhi syarat kelulusan atau tidak, suhu masuk kategori tertentu, stok kosong atau tersedia. Dalam loop, keputusan itu ditulis dengan if/else. Dalam kode ter-vektorisasi, keputusan per elemen dititipkan kepada np.where dan np.select — dua fungsi yang menerima kondisi berbentuk array boolean dan menghasilkan array keputusan.
Bab ini membahas empat pola:
np.wheredengan dua cabang nilai.np.wherebersarang untuk percabangan tiga arah.np.selectuntuk banyak kondisi sekaligus.np.wheredengan array sebagai kedua cabang, plus mode pencarian indeks.
np.where dengan dua cabang #
Aturan kelulusan: nilai >= 75 dinyatakan lulus, sisanya remedial:
import numpy as np
nilai = np.array([70, 85, 60, 90])
status = np.where(nilai >= 75, "lulus", "remedial")
print(status)
print(status.dtype)Output yang Dihasilkan:
['remedial' 'lulus' 'remedial' 'lulus']
<U8- Baris 4 (
nilai >= 75): perbandingan menghasilkan array boolean[False, True, False, True]. - Baris 5 (
np.where): elemen dengan kondisiTruemengambil cabang pertama ("lulus"), sisanya cabang kedua ("remedial"). - Baris 7-8: hasil berdtype
<U8— panjang string terpanjang di antara kedua cabang menentukan lebar penyimpanan tiap elemen.
Percabangan tiga arah dengan np.where bersarang #
Tiga kategori membutuhkan dua tingkat keputusan. Cabang dalam dievaluasi lebih dulu, lalu menjadi cabang kedua bagi np.where luar:
import numpy as np
nilai = np.array([92, 78, 85, 65, 88])
grade = np.where(nilai >= 85, "A", np.where(nilai >= 70, "B", "C"))
print(grade)
print(grade.dtype)Output yang Dihasilkan:
['A' 'B' 'A' 'C' 'A']
<U1- Baris 5 (np.where dalam): nilai yang gagal syarat
>= 85diperiksa lagi —>= 70mendapat"B", sisanya"C". - Baris 5 (np.where luar): nilai
>= 85mengambil"A", sisanya mewarisi hasil cabang dalam. - Baris 7:
92 → "A",78 → "B",85 → "A",65 → "C",88 → "A"; dtype<U1karena semua label satu huruf.
np.select untuk banyak kondisi #
Ketika jumlah kategori bertambah, np.where bersarang cepat sulit dibaca. np.select menerima daftar kondisi dan daftar nilai yang sejajar, dengan default untuk sisanya:
import numpy as np
suhu = np.array([-2.0, 18.5, 27.0, 31.5, 24.0])
kategori = np.select(
[suhu <= 0, suhu < 25, suhu < 30],
["beku", "sejuk", "hangat"],
default="panas",
)
print(kategori)
print(kategori.dtype)Output yang Dihasilkan:
['beku' 'sejuk' 'hangat' 'panas' 'sejuk']
<U6- Baris 5 (condlist): tiga kondisi dievaluasi berurutan; elemen mendapat nilai dari kondisi pertama yang terpenuhi, sehingga batas tumpang-tindih aman untuk dibaca.
- Baris 6 (choicelist):
"beku"untuk suhu beku,"sejuk"untuk suhu di bawah 25,"hangat"untuk suhu di bawah 30. - Baris 7 (
default): suhu31.5tidak memenuhi satu pun kondisi, sehingga jatuh ke"panas"; dtype<U6mengikuti string terpanjang.
np.where dengan array sebagai cabang #
Kedua cabang np.where tidak harus scalar — keduanya boleh berupa array yang dibroadcast ke bentuk kondisi. Mode lain np.where tanpa cabang mengembalikan posisi elemen:
import numpy as np
stok = np.array([5, 0, 12, 3])
harga = np.array([15000, 22000, 8000, 17000])
omzet = np.where(stok > 0, harga * stok, 0)
print(omzet)
print(np.where(stok == 0))Output yang Dihasilkan:
[75000 0 96000 51000]
(array([1]),)- Baris 6 (
np.where(stok > 0, harga * stok, 0)): cabang pertama berupa array hasilharga * stok, cabang kedua scalar0; produk dengan stok positif mendapat nilai omzet, sisanya nol. - Baris 7 (
np.where(stok == 0)): tanpa cabang, fungsi mengembalikan tuple berisi array indeks — stok kosong berada di posisi1. Tuple muncul karena pencarian indeks bisa dilakukan pada beberapa dimensi sekaligus.
Tabel berikut merangkum pemilihan alat:
| Kebutuhan | Alat | Bentuk hasil |
|---|---|---|
| dua cabang nilai | np.where(kondisi, x, y) | array senilai bentuk kondisi |
| if/elif/else tiga arah | np.where bersarang | array string atau angka |
| banyak kondisi + default | np.select | array string atau angka |
| posisi elemen yang memenuhi syarat | np.where(kondisi) | tuple array indeks |