Banyak aturan dunia nyata berbentuk bertingkat: tarif listrik naik per blok pemakaian, pajak berubah sesuai lapisan penghasilan, dan predikat nilai ujian ditentukan per rentang. Menuliskan aturan semacam ini dengan if per elemen berarti loop Python yang lambat. NumPy menyediakan dua fungsi vektor untuk keperluan ini: np.piecewise dan np.select.
np.piecewise: Satu Aturan per Rentang #
Fungsi np.piecewise(x, condlist, funclist) menerima tiga argumen: array input x, daftar kondisi boolean condlist, dan daftar nilai atau fungsi funclist. Setiap kondisi mendefinisikan satu wilayah input, dan elemen funclist yang sejajar menentukan hasilnya. Kita mulai dari tarif per kWh yang bertingkat:
import numpy as np
pemakaian = np.array([85, 100, 150, 275])
tarif = np.piecewise(
pemakaian,
[pemakaian <= 100, (pemakaian > 100) & (pemakaian <= 200)],
[1350, 1850, 2400],
)
print(tarif)
print(tarif.dtype)Output yang Dihasilkan:
[1350 1350 1850 2400]
int64Mari kita bedah:
- Baris 5 (argumen
condlist): berisi dua ekspresi boolean array. Elemen 85 dan 100 memenuhi kondisi pertama; 150 memenuhi kondisi kedua; 275 tidak memenuhi keduanya. - Baris 6 (argumen
funclist):1350dipakai di wilayah kondisi pertama dan1850di wilayah kedua. Elemen ketiga,2400, tidak punya kondisi pasangan sehingga menjadi nilai default untuk input yang tidak memenuhi kondisi mana pun. - Baris 8 (
print(tarif)): hasilnya array int64 seukuran input, tanpa loop eksplisit.
Aturan pasangannya sederhana: bila funclist berisi satu elemen lebih banyak daripada condlist, elemen terakhir berlaku sebagai default.
piecewise dengan Fungsi (callable) #
Nilai pada funclist boleh berupa fungsi (lambda), bukan hanya angka. Fungsi tersebut menerima subset x yang memenuhi kondisinya, sehingga rumus yang berbeda per blok bisa dihitung sekaligus. Contoh berikut menghitung total tagihan listrik dengan tarif bertingkat — 100 kWh pertama seharga 1350, 100 kWh berikutnya 1850, sisanya 2400:
import numpy as np
kwh = np.array([85, 100, 150, 275])
tagihan = np.piecewise(
kwh,
[kwh <= 100, (kwh > 100) & (kwh <= 200), kwh > 200],
[
lambda x: x * 1350,
lambda x: 100 * 1350 + (x - 100) * 1850,
lambda x: 100 * 1350 + 100 * 1850 + (x - 200) * 2400,
],
)
print(tagihan)Output yang Dihasilkan:
[114750 135000 227500 500000]Setiap lambda hanya dipanggil untuk elemen di wilayahnya: pemakaian 150 kWh ditagih 135.000 untuk blok pertama ditambah 92.500 untuk sisa 50 kWh, total 227500. Perhatikan juga kondisinya dibuat saling lepas (kwh <= 100, lalu (kwh > 100) & ...). Alasannya: ketika dua kondisi sama-sama memenuhi satu elemen, hasil dari kondisi yang diuji lebih akhir menimpa yang lebih awal, dan hasil menjadi bergantung pada urutan penulisan.
np.select untuk Pemetaan Berbasis Nilai #
np.select(condlist, choicelist, default=...) bekerja mirip np.piecewise, tetapi berorientasi nilai: setiap kondisi dipetakan langsung ke sebuah nilai, termasuk string. Fungsi ini cocok untuk pelabelan kategori:
import numpy as np
nilai = np.array([95, 78, 60, 45])
predikat = np.select(
[nilai >= 90, nilai >= 75, nilai >= 60],
["A", "B", "C"],
default="D",
)
print(predikat)
urutan_terbalik = np.select(
[nilai >= 60, nilai >= 75, nilai >= 90],
["C", "B", "A"],
default="D",
)
print(urutan_terbalik)Output yang Dihasilkan:
['A' 'B' 'C' 'D']
['C' 'C' 'C' 'D']Pemanggilan pertama menghasilkan predikat yang diharapkan. Pemanggilan kedua menukar urutan kondisi menjadi dari rentang terluas; nilai 95 kini memenuhi kondisi nilai >= 60 terlebih dahulu dan terkunci sebagai “C”. Contoh ini memperlihatkan bahwa pada np.select urutan kondisi adalah bagian dari logika program.
Tabel berikut merangkum perbedaan kedua fungsi:
| Aspek | np.piecewise | np.select |
|---|---|---|
| Tujuan utama | Rumus berbeda per rentang input | Pemetaan kondisi ke nilai tetap |
| Elemen daftar hasil | Scalar atau callable | Nilai apa pun, termasuk string |
| Kondisi tumpang tindih | Kondisi terakhir yang cocok menimpa | Kondisi pertama yang cocok menang |
| Nilai bila tak ada cocok | Elemen funclist terakhir (default implisit) | Parameter default (wajib eksplisit) |
Sebagai panduan memilih: gunakan np.piecewise bila tiap wilayah punya rumus berbeda, dan np.select bila hasilnya berupa label atau nilai tetap per kategori.