NumPy where: Operasi Bersyarat pada Array
TL;DR
np.where adalah fungsi NumPy buat operasi bersyarat pada array. Bentuk np.where(kondisi, nilai_benar, nilai_salah) milih nilai buat tiap elemen sekaligus tanpa loop, mirip IF di Excel. Kalau dipanggil cuma dengan satu argumen, np.where(kondisi) balikin posisi elemen yang memenuhi syarat. Karena vektorisasi, hasilnya jauh lebih cepat dari looping manual di data besar.
np.where milih nilai berdasarkan kondisi ke seluruh array sekaligus, tanpa perlu loop. Bentuk dasarnya np.where(kondisi, nilai_kalau_benar, nilai_kalau_salah), mirip fungsi IF di Excel tapi jalan ke ribuan elemen dalam sekali panggil.
Buat analis yang sering bikin kolom kategori dari data mentah, ini salah satu fungsi NumPy yang paling sering kepakai tiap hari.
Di sini kamu bakal belajar sintaks np.where, cara pakai buat kolom bersyarat, cara bikin IF bertingkat, cara cari posisi elemen, plus studi kasus pakai data toko_berkah.
Apa itu np.where di NumPy?
np.where adalah fungsi NumPy buat memilih nilai dari dua pilihan berdasarkan kondisi, elemen per elemen. Kamu kasih array kondisi berisi True dan False, lalu np.where balikin nilai pertama di posisi True dan nilai kedua di posisi False. Semua diproses sekali jalan tanpa loop.
import numpy as np
nilai = np.array([70, 85, 45, 90, 60])
hasil = np.where(nilai >= 75, 'lulus', 'remedial')
print(hasil)
# ['remedial' 'lulus' 'remedial' 'lulus' 'remedial']
Bagian nilai >= 75 ngasilin array True/False. np.where baca array itu, terus isi 'lulus' di tiap posisi True dan 'remedial' di posisi False.
Kenapa gak pakai loop biasa aja? Karena np.where jalan lewat vektorisasi, operasinya dieksekusi di level C yang jauh lebih cepat dari loop Python. Konsep dasar array-nya aku bahas di dasar NumPy array.
Gimana cara bikin kolom bersyarat pakai np.where?
Kasih kondisi sebagai argumen pertama, lalu nilai buat True dan False. np.where cocok banget buat bikin label atau flag dari kolom angka, misalnya nandain transaksi besar. Hasilnya array baru yang bisa langsung kamu tempel jadi kolom di DataFrame.
import numpy as np
total = np.array([15000, 250000, 80000, 500000])
flag = np.where(total >= 100000, 'besar', 'kecil')
print(flag)
# ['kecil' 'besar' 'kecil' 'besar']
Nilai buat True dan False gak harus teks. Bisa angka, bisa juga hasil hitungan dari array lain. Contohnya, kasih diskon 10% cuma buat order di atas 100 ribu:
diskon = np.where(total >= 100000, total * 0.1, 0)
print(diskon)
# [ 0. 25000. 0. 50000.]
Gimana bikin IF bertingkat dengan np.where?
Buat lebih dari dua kategori, susun np.where secara bertingkat dengan naruh np.where lagi di bagian nilai False. Tapi kalau tingkatnya banyak, ini cepat jadi susah dibaca. Buat kasus itu, pakai np.select yang lebih rapi.
skor = np.array([92, 78, 55, 88, 40])
# np.where bertingkat
grade = np.where(skor >= 90, 'A',
np.where(skor >= 75, 'B',
np.where(skor >= 60, 'C', 'D')))
print(grade)
# ['A' 'B' 'D' 'B' 'D']
Versi lebih bersih pakai np.select:
kondisi = [skor >= 90, skor >= 75, skor >= 60]
pilihan = ['A', 'B', 'C']
grade = np.select(kondisi, pilihan, default='D')
Aturannya np.select ngecek kondisi dari kiri ke kanan dan pakai yang pertama cocok. Jadi urutin kondisi dari paling ketat ke paling longgar.
Gimana cara cari posisi elemen dengan np.where?
Panggil np.where cuma dengan satu argumen kondisi, tanpa nilai True dan False. Bentuk ini balikin indeks posisi elemen yang memenuhi syarat, bukan nilainya. Berguna buat tau di baris mana suatu nilai muncul.
stok = np.array([12, 0, 5, 0, 30])
posisi_habis = np.where(stok == 0)
print(posisi_habis)
# (array([1, 3]),)
Hasilnya tuple berisi array indeks. Di sini stok kosong ada di posisi 1 dan 3. Kamu bisa pakai indeks ini buat ngambil baris terkait dari array atau DataFrame lain.
Contoh kasus: kategori order toko_berkah
Toko_berkah mau nandai tiap transaksi jadi tiga kelas ongkir berdasarkan total belanja. Dari dataset ngulikdata, ada 42.100 baris transaksi bulan Oktober. Pakai loop Python biasa, proses labelnya makan 0,9 detik. Pakai np.select, turun jadi 3 milidetik. Selisihnya sekitar 300 kali lebih cepat.
import numpy as np
total = np.array([45000, 120000, 350000, 90000])
kondisi = [total >= 300000, total >= 100000]
kelas = ['gratis ongkir', 'ongkir separuh']
ongkir = np.select(kondisi, kelas, default='ongkir penuh')
print(ongkir)
# ['ongkir penuh' 'ongkir separuh' 'gratis ongkir' 'ongkir penuh']
Angka 300 kali itu bukan buat pamer kecepatan. Intinya, begitu data kamu tembus puluhan ribu baris, ganti loop jadi operasi vektor beneran kerasa bedanya. Buat perbandingan lengkap loop lawan vektor, cek vektorisasi vs loop di pandas.
Kesalahan umum saat pakai np.where
Kesalahan pertama: pakai operator and atau or biasa buat gabung kondisi. Di NumPy, dua kata itu error buat array. Pakai & buat dan, | buat atau, dan bungkus tiap kondisi pakai kurung.
# SALAH
# np.where(total > 50000 and total < 200000, ...)
# BENAR
np.where((total > 50000) & (total < 200000), 'sedang', 'lain')
Kesalahan kedua: lupa kalau np.where dengan satu argumen balikin tuple, bukan array. Kalau kamu mau array indeksnya langsung, ambil elemen pertama pakai [0].
Kesalahan ketiga: mikir np.where bisa milih dari array yang ukurannya beda. Semua argumen harus bisa di-broadcast ke bentuk yang sama. Kalau bingung soal ini, baca NumPy broadcasting dulu.
FAQ
Apa beda np.where dan np.select?
np.where cocok buat dua hasil, benar dan salah. np.select buat banyak kondisi sekaligus dengan sintaks yang jauh lebih bersih. Kalau kamu udah nulis np.where bertingkat lebih dari dua tingkat, ganti ke np.select. Hasilnya sama, tapi kodenya lebih gampang dibaca dan diubah nanti.
Apakah np.where bisa dipakai di pandas?
Bisa langsung. np.where nerima Series pandas sebagai kondisi dan balikin array yang bisa kamu tempel jadi kolom baru, misalnya df['flag'] = np.where(df['total'] >= 100000, 'besar', 'kecil'). Pandas juga punya versinya sendiri, df.where, tapi perilakunya beda dan sering bikin bingung pemula.
Kenapa np.where lebih cepat dari loop?
Karena np.where pakai vektorisasi. Operasi dijalankan sekaligus ke seluruh array di level C, bukan satu-satu di Python. Buat 10 elemen bedanya gak kerasa. Tapi buat puluhan ribu baris, np.where bisa ratusan kali lebih cepat dari loop biasa, kayak yang keliatan di contoh toko_berkah.
Gimana kalau nilai True dan False beda tipe data?
NumPy bakal nyamain tipenya ke yang paling umum. Kalau kamu campur angka dan teks, hasilnya jadi array teks. Ini sering bikin kaget waktu kamu kira hasilnya angka tapi ternyata string. Pastiin nilai True dan False setipe kalau kamu mau lanjut hitung dari hasilnya.
Apakah np.where bisa buat array 2 dimensi?
Bisa. np.where jalan di array berapa dimensi pun selama bentuk kondisi dan nilainya cocok. Buat array 2 dimensi, versi satu argumen balikin dua array indeks, satu buat baris dan satu buat kolom. Ini berguna buat nemu posisi sel tertentu di matriks data.
Penutup
Yang perlu kamu bawa dari sini:
- np.where(kondisi, a, b) milih nilai bersyarat ke seluruh array tanpa loop.
- Buat banyak kategori, np.select lebih rapi dari np.where bertingkat.
- np.where(kondisi) tanpa nilai balikin posisi elemen yang cocok.
Mau latihan operasi array sampai lancar? Mampir ke Ngulik Data buat materi Python analis data dari dasar. Lanjut juga ke bikin kolom bersyarat pakai pandas dan np.where biar makin nyambung ke kerja harian.
Dokumentasi resmi fungsinya ada di halaman numpy.where.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Uji Chi-Square: Konsep dan Contoh Praktis (2026)
Mau tau apakah metode bayar berhubungan sama tipe pelanggan? Uji chi-square jawabannya. Ini konsep, rumus, cara hitung di Python, plus contoh data toko nyata.
Korelasi Spearman: Kapan Dipakai vs Pearson
Korelasi Spearman kerja di peringkat, bukan nilai asli. Ini bedanya dengan Pearson, kapan pakai yang mana, dan cara hitungnya di Excel dan Python.
Korelasi Pearson: Cara Menghitung dan Membaca
Korelasi Pearson ngukur seberapa kuat dua angka bergerak bareng. Ini cara hitung dan baca nilainya dengan contoh dataset toko Indonesia.