Data yang dikumpulkan dari banyak sumber hampir pasti mengandung duplikasi: ID transaksi tercatat dua kali, nama kota berulang, atau ID pelanggan yang muncul di dua channel sekaligus. np.unique merapikan satu array menjadi daftar nilai unik, sedangkan keluarga fungsi set operation — union1d, intersect1d, setdiff1d, setxor1d — membandingkan dua array seperti operasi himpunan pada matematika.

Semua fungsi pada bab ini mengembalikan hasil yang unik dan terurut menaik. Sifat itu membuat np.unique sekaligus menjadi alat deteksi duplikat yang praktis: bila len(np.unique(a)) lebih kecil dari len(a), array a pasti berisi nilai ganda.

unique: Nilai Unik Secara Terurut #

python
import numpy as np

transaksi = np.array([3, 1, 3, 5, 2, 1, 3])
print(np.unique(transaksi))

kota = np.array(["Medan", "Bali", "Medan", "Solo", "Bali", "Solo"])
print(np.unique(kota))

Output yang Dihasilkan:

text
[1 2 3 5]
['Bali' 'Medan' 'Solo']

Penjelasan singkat:

  1. Baris 4 (np.unique(transaksi)): tujuh nilai transaksi diringkas menjadi empat nilai unik [1 2 3 5], terurut menaik.
  2. Baris 7 (np.unique(kota)): array string juga ditangani; urutannya leksikografis (abjad), sehingga 'Bali' mendahului 'Medan'.

Tiga Opsi return_* untuk Analisis Frekuensi #

np.unique punya tiga parameter bendera yang menambah keluaran: return_index, return_counts, dan return_inverse. Ketika salah satu diaktifkan, fungsi mengembalikan tuple, bukan satu array.

python
import numpy as np

transaksi = np.array([3, 1, 3, 5, 2, 1, 3])
unik, indeks = np.unique(transaksi, return_index=True)
print(unik)
print(indeks)
unik, jumlah = np.unique(transaksi, return_counts=True)
print(jumlah)
unik, balik = np.unique(transaksi, return_inverse=True)
print(balik)
print(unik[balik])

Output yang Dihasilkan:

text
[1 2 3 5]
[1 4 0 3]
[2 1 3 1]
[2 0 2 3 1 0 2]
[3 1 3 5 2 1 3]

Mari kita bedah kelima baris keluaran:

  1. Baris 5 (print(unik)): nilai unik terurut [1 2 3 5] — dasar bagi semua keluaran lain.
  2. Baris 6 (indeks, dari return_index=True): [1 4 0 3] adalah posisi kemunculan pertama tiap nilai unik: 1 pertama muncul di indeks 1, 2 di indeks 4, 3 di indeks 0, dan 5 di indeks 3.
  3. Baris 8 (jumlah, dari return_counts=True): [2 1 3 1] berarti 1 muncul dua kali, 2 sekali, 3 tiga kali, dan 5 sekali. Pasangan unik dan jumlah membentuk tabel frekuensi sederhana.
  4. Baris 10 (balik, dari return_inverse=True): [2 0 2 3 1 0 2] memetakan setiap elemen asli ke posisinya di array unik — elemen pertama 3 menunjuk posisi 2 array unik, dan seterusnya.
  5. Baris 11 (unik[balik]): membuktikan pemetaan tersebut; hasilnya persis array asli. return_inverse berguna untuk memberi “ID ringkas” pada banyak baris data.

Operasi Himpunan antara Dua Dataset #

Empat fungsi berikut membandingkan dua kelompok ID pelanggan: yang berbelanja lewat channel online dan yang datang langsung ke toko. Semua fungsi memperlakukan isi array sebagai himpunan, sehingga hasilnya selalu unik dan terurut.

python
import numpy as np

pelanggan_online = np.array([101, 103, 105, 107])
pelanggan_toko = np.array([103, 107, 108])
print(np.union1d(pelanggan_online, pelanggan_toko))
print(np.intersect1d(pelanggan_online, pelanggan_toko))
print(np.setdiff1d(pelanggan_online, pelanggan_toko))
print(np.setxor1d(pelanggan_online, pelanggan_toko))

Output yang Dihasilkan:

text
[101 103 105 107 108]
[103 107]
[101 105]
[101 105 108]

Tabel berikut merangkum keempatnya:

FungsiPadanan himpunanArti pada contohHasil
np.union1d(A, B)A gabung Bsemua pelanggan dari dua channel[101 103 105 107 108]
np.intersect1d(A, B)A irisan Bberbelanja di kedua channel[103 107]
np.setdiff1d(A, B)A dikurangi Bhanya pernah online[101 105]
np.setxor1d(A, B)A xor Bhanya muncul di salah satu channel[101 105 108]

Perhatikan urutan argumen: np.setdiff1d(pelanggan_toko, pelanggan_online) memberi hasil berbeda, yaitu [108] — pelanggan yang hanya datang ke toko.

Opsi assume_unique #

Keluaran yang selalu di-unik-kan tidak gratis: tiap fungsi set operation menjalankan langkah unique internal pada masukannya. Jika kita tahu pasti kedua array bebas duplikat, berikan assume_unique=True agar langkah itu dilewati. Namun jika asumsinya keliru, hasilnya tidak lagi merupakan himpunan yang benar.

python
import numpy as np

a = np.array([1, 1, 2, 3])
b = np.array([2])
print(np.setdiff1d(a, b))
print(np.setdiff1d(a, b, assume_unique=True))

Output yang Dihasilkan:

text
[1 3]
[1 1 3]

Yang berbeda di sini:

  1. Baris 5 (tanpa opsi): np.setdiff1d menjalankan pembersihan duplikat internal, sehingga hasilnya benar-benar himpunan [1 3] meskipun a berisi dua 1.
  2. Baris 6 (assume_unique=True): fungsi memercayai klaim kita bahwa a unik. Klaim itu keliru, sehingga duplikat 1 bocor ke hasil [1 1 3].