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:

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

text
['Rina' 'Budi' 'Andi']

Bedah baris demi baris:

  1. Baris 4 (peserta = np.array([...])): kumpulan pilihan disiapkan sebagai array 1-D; isi boleh string seperti di sini maupun angka.
  2. Baris 5 (pemenang = ...): rng.choice memilih tiga elemen dari peserta; argumen replace=False melarang nama yang sama muncul dua kali, sehingga ketiga pemenang dijamin berbeda.

Parameter yang perlu dikenal selengkapnya:

ParameterArtiContoh pemakaian
akumpulan pilihan; boleh array atau int (setara arange(a))rng.choice(6) memilih dari 0-5
sizebanyaknya elemen dipilih; boleh tuple untuk array 2-Dsize=(2, 3)
replacebolehkah elemen yang sama dipilih lagi; default TrueFalse untuk pemenang unik
ppeluang tiap pilihan; total harus 1[0.5, 0.3, 0.15, 0.05]
axissumbu yang disampling pada array ≥ 2-D; default 0axis=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:

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

text
ValueError: Cannot take a larger sample than population when replace is False

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

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

text
0%: 0.501
10%: 0.303
25%: 0.145
50%: 0.050

Bedah baris demi baris:

  1. Baris 6 (hasil = ...): 10.000 pelanggan disimulasikan sekaligus; tiap elemen hasil adalah satu nilai diskon yang terpilih sesuai bobot p.
  2. Baris 7 (np.unique(hasil, return_counts=True)): mengembalikan nilai unik yang terurut (0, 10, 25, 50) dan frekuensi kemunculannya.
  3. 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:

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

text
[[ 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.