Selain membangkitkan angka dari distribusi, numpy.random juga bisa mengambil elemen dari kumpulan pilihan yang sudah kita punya: mengundi pemenang, memilih sampel data, atau menentukan hadiah dengan peluang berbeda. Semua kebutuhan itu dilayani satu method Generator bernama choice().
Method ini berlaku untuk array apa pun — angka maupun string — dan memberi kita kendali atas empat hal: jumlah pilihan (size), pengembalian (replace), pembobotan peluang (p), serta sumbu (axis) untuk array multidimensi.
Memilih Elemen dari Array #
Bentuk paling dasar adalah rng.choice(a, size) yang mengambil elemen dari array a secara acak:
import numpy as np
rng = np.random.default_rng(42)
peserta = np.array(["Budi", "Siti", "Dewi", "Andi", "Rina"])
pemenang = rng.choice(peserta, size=3, replace=False)
print(pemenang)Output yang Dihasilkan:
['Rina' 'Budi' 'Andi']Bedah baris demi baris:
- Baris 4 (
peserta = np.array([...])): kumpulan pilihan disiapkan sebagai array 1-D; isi boleh string seperti di sini maupun angka. - Baris 5 (
pemenang = ...):rng.choicememilih tiga elemen daripeserta; argumenreplace=Falsemelarang nama yang sama muncul dua kali, sehingga ketiga pemenang dijamin berbeda.
Parameter yang perlu dikenal selengkapnya:
| Parameter | Arti | Contoh pemakaian |
|---|---|---|
a | kumpulan pilihan; boleh array atau int (setara arange(a)) | rng.choice(6) memilih dari 0-5 |
size | banyaknya elemen dipilih; boleh tuple untuk array 2-D | size=(2, 3) |
replace | bolehkah elemen yang sama dipilih lagi; default True | False untuk pemenang unik |
p | peluang tiap pilihan; total harus 1 | [0.5, 0.3, 0.15, 0.05] |
axis | sumbu yang disampling pada array ≥ 2-D; default 0 | axis=0 memilih baris |
replace=False dan Batas Populasi #
Dengan replace=False, jumlah pilihan tidak boleh melebihi banyaknya elemen di a. Jika dilanggar, method memunculkan ValueError. Kita uji sengaja dengan size=6 pada lima peserta dan menangkap pesannya agar tetap terbaca:
import numpy as np
rng = np.random.default_rng(42)
peserta = np.array(["Budi", "Siti", "Dewi", "Andi", "Rina"])
try:
rng.choice(peserta, size=6, replace=False)
except ValueError as e:
print("ValueError:", e)Output yang Dihasilkan:
ValueError: Cannot take a larger sample than population when replace is FalseStruktur try/except di atas tidak mengubah perilaku NumPy; tujuannya hanya menampilkan pesan error yang persis sama seperti saat dijalankan di terminal. Kesalahan ini paling sering muncul saat size dihitung dinamis dari data lain — pastikan nilainya tidak melebihi len(a), atau gunakan replace=True bila pengulangan memang boleh.
Peluang Berbobot dengan p #
Secara default setiap elemen punya peluang sama. Untuk undian berbobot — misalnya kupon belanja yang memberi diskon 0%, 10%, 25%, dan 50% dengan peluang 50%, 30%, 15%, dan 5% — berikan array p dengan panjang sama seperti a dan total tepat 1:
import numpy as np
rng = np.random.default_rng(42)
diskon = np.array([0, 10, 25, 50])
p = np.array([0.50, 0.30, 0.15, 0.05])
hasil = rng.choice(diskon, size=10_000, p=p)
nilai, frek = np.unique(hasil, return_counts=True)
for n, f in zip(nilai, frek):
print(f"{n}%: {f / len(hasil):.3f}")Output yang Dihasilkan:
0%: 0.501
10%: 0.303
25%: 0.145
50%: 0.050Bedah baris demi baris:
- Baris 6 (
hasil = ...): 10.000 pelanggan disimulasikan sekaligus; tiap elemenhasiladalah satu nilai diskon yang terpilih sesuai bobotp. - Baris 7 (
np.unique(hasil, return_counts=True)): mengembalikan nilai unik yang terurut (0, 10, 25, 50) dan frekuensi kemunculannya. - Baris 8-9 (
for n, f in zip(...)): frekuensi dibagi jumlah sampel menjadi proporsi, lalu dicetak tiga desimal — hasilnya 0,501 / 0,303 / 0,145 / 0,050, sangat dekat dengan bobot yang diberikan.
Sampling Baris pada Array 2-D #
Untuk array dua dimensi atau lebih, choice menerima argumen axis. Dengan axis=0, yang dipilih adalah baris utuh, bukan elemen tunggal:
import numpy as np
rng = np.random.default_rng(0)
matriks = np.arange(12).reshape(3, 4)
print(rng.choice(matriks, axis=0, size=2))Output yang Dihasilkan:
[[ 8 9 10 11]
[ 4 5 6 7]]Hasilnya dua baris utuh dari matriks — baris indeks 2 (8 9 10 11) lalu baris indeks 1 (4 5 6 7). Pola ini praktis untuk mengambil sampel baris dataset tanpa memecah array per kolom. Dengan array 1-D, argumen axis tidak diperlukan dan boleh dibiarkan pada nilai default-nya.