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.where dengan dua cabang nilai.
  • np.where bersarang untuk percabangan tiga arah.
  • np.select untuk banyak kondisi sekaligus.
  • np.where dengan array sebagai kedua cabang, plus mode pencarian indeks.

np.where dengan dua cabang #

Aturan kelulusan: nilai >= 75 dinyatakan lulus, sisanya remedial:

python
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:

text
['remedial' 'lulus' 'remedial' 'lulus']
<U8
  1. Baris 4 (nilai >= 75): perbandingan menghasilkan array boolean [False, True, False, True].
  2. Baris 5 (np.where): elemen dengan kondisi True mengambil cabang pertama ("lulus"), sisanya cabang kedua ("remedial").
  3. 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:

python
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:

text
['A' 'B' 'A' 'C' 'A']
<U1
  1. Baris 5 (np.where dalam): nilai yang gagal syarat >= 85 diperiksa lagi — >= 70 mendapat "B", sisanya "C".
  2. Baris 5 (np.where luar): nilai >= 85 mengambil "A", sisanya mewarisi hasil cabang dalam.
  3. Baris 7: 92 → "A", 78 → "B", 85 → "A", 65 → "C", 88 → "A"; dtype <U1 karena 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:

python
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:

text
['beku' 'sejuk' 'hangat' 'panas' 'sejuk']
<U6
  1. Baris 5 (condlist): tiga kondisi dievaluasi berurutan; elemen mendapat nilai dari kondisi pertama yang terpenuhi, sehingga batas tumpang-tindih aman untuk dibaca.
  2. Baris 6 (choicelist): "beku" untuk suhu beku, "sejuk" untuk suhu di bawah 25, "hangat" untuk suhu di bawah 30.
  3. Baris 7 (default): suhu 31.5 tidak memenuhi satu pun kondisi, sehingga jatuh ke "panas"; dtype <U6 mengikuti 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:

python
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:

text
[75000     0 96000 51000]
(array([1]),)
  1. Baris 6 (np.where(stok > 0, harga * stok, 0)): cabang pertama berupa array hasil harga * stok, cabang kedua scalar 0; produk dengan stok positif mendapat nilai omzet, sisanya nol.
  2. Baris 7 (np.where(stok == 0)): tanpa cabang, fungsi mengembalikan tuple berisi array indeks — stok kosong berada di posisi 1. Tuple muncul karena pencarian indeks bisa dilakukan pada beberapa dimensi sekaligus.

Tabel berikut merangkum pemilihan alat:

KebutuhanAlatBentuk hasil
dua cabang nilainp.where(kondisi, x, y)array senilai bentuk kondisi
if/elif/else tiga arahnp.where bersarangarray string atau angka
banyak kondisi + defaultnp.selectarray string atau angka
posisi elemen yang memenuhi syaratnp.where(kondisi)tuple array indeks