Operasi perbandingan dan logika

Menghasilkan array boolean dari perbandingan antar array.

Daftar isi

Operator perbandingan pada array NumPy menghasilkan array boolean, bukan satu nilai benar atau salah. Topik ini membahas perbandingan per elemen dengan ==, <, >, <=, >=, dan !=, penggabungan kondisi dengan operator &, |, dan ~ beserta kewajiban tanda kurung, error yang muncul bila kata kunci and dipakai pada array, serta fungsi np.all dan np.any untuk meringkas array boolean menjadi satu keputusan.

Perbandingan menghasilkan array boolean#

Perbandingan array dengan skalar bekerja per elemen, sama seperti aritmetika array. Setiap elemen dibandingkan dengan nilai skalar tersebut, dan hasilnya adalah array boolean yang panjangnya sama dengan array asalnya.

python
import numpy as np

a = np.array([10, 20, 30, 40])
print(a > 25)
print(a == 20)
text Keluaran
[False False  True  True]
[False  True False False]

Baris pertama menandai posisi yang nilainya di atas 25, yaitu 30 dan 40, sedangkan baris kedua menandai posisi yang nilainya tepat 20. Operator <, <=, >=, dan != mengikuti pola yang sama. Array boolean yang dihasilkan menjadi bahan dasar penyaringan dan penghitungan nilai pada data yang lebih besar.

Perbandingan juga dapat dilakukan antara dua array yang sebangun. Setiap pasangan elemen pada posisi yang sama dibandingkan, dan hasilnya kembali berupa array boolean.

python
import numpy as np

mandiri = np.array([80, 92, 78])
kelompok = np.array([85, 88, 74])
print(mandiri > kelompok)
text Keluaran
[False  True  True]

Nilai mandiri lebih tinggi pada posisi kedua dan ketiga, sehingga keduanya bertanda True, sedangkan posisi pertama bertanda False.

Hasil perbandingan adalah array boolean yang juga memiliki atribut dtype, dan nilainya bool. Array ini dapat disimpan dalam variabel, digabung dengan operator logika, atau dipakai untuk menyaring nilai pada posisi yang bertanda True. Array boolean yang dipakai untuk menyaring nilai semacam ini dikenal dengan sebutan mask. Penyimpanan dalam variabel menjadi kebiasaan yang baik ketika kondisinya panjang, karena mask yang diberi nama lebih mudah dibaca daripada ekspresi yang bersambung.

Menggabungkan kondisi dengan &, |, dan ~#

Dua kondisi sering perlu digabung, misalnya suhu yang cukup tinggi sekaligus kelembapan yang rendah. Kata kunci and dan or milik Python tidak dapat dipakai untuk array, karena alasan yang dibahas pada bagian berikutnya. NumPy menyediakan operator & untuk logika dan, | untuk logika atau, serta ~ untuk negasi, dan ketiganya bekerja per elemen. Setiap kondisi wajib dibungkus tanda kurung karena & lebih kuat daripada operator perbandingan dalam urutan evaluasi.

python
import numpy as np

suhu = np.array([18, 21, 24, 27, 23, 19])
lembab = np.array([70, 65, 80, 85, 72, 68])
print((suhu >= 21) & (lembab < 80))
print((suhu < 20) | (lembab > 82))
print(~(suhu >= 21))
text Keluaran
[False  True False False  True False]
[ True False False  True False  True]
[ True False False False False  True]

Baris pertama menggabungkan suhu >= 21 dengan lembab < 80, dan hanya posisi kedua dan kelima yang memenuhi keduanya. Baris kedua menandai posisi yang suhunya di bawah 20 atau kelembapannya di atas 82. Baris ketiga membalik suhu >= 21, sehingga posisi yang dingin bertanda True.

Mengapa and gagal pada array#

Kata kunci and menuntut satu nilai kebenaran dari setiap operand, dan Python memeriksanya dengan memanggil konversi boolean pada operand tersebut. Array dengan lebih dari satu elemen tidak memiliki satu nilai kebenaran, karena elemennya bisa campuran antara True dan False. Python menolak dengan error, dan pesannya menjelaskan masalah tersebut secara langsung.

python
import numpy as np

a = np.array([True, False, True])
try:
    hasil = a and a
except Exception as e:
    print(f"{type(e).__name__}: {e}")
text Keluaran
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Pesan error ini muncul setiap kali array multi-elemen dipakai pada konteks yang menuntut satu nilai kebenaran, termasuk and, or, dan percabangan if. Pesan itu sendiri mengarahkan pada any dan all, yaitu dua fungsi yang dijelaskan pada bagian berikutnya.

Pengecualiannya adalah array dengan tepat satu elemen, karena kebenarannya dapat ditentukan dari nilai tunggal tersebut. Meski demikian, mengandalkan pengecualian ini membuat kode berperilaku berbeda tergantung ukuran array, sehingga and dan or sebaiknya dihindari sepenuhnya pada data array. Operator & dan | dengan tanda kurung adalah bentuk yang selalu benar untuk ukuran array apa pun.

np.all dan np.any#

Fungsi np.all menghasilkan True bila semua elemen array boolean bernilai True, sedangkan np.any menghasilkan True bila sedikitnya satu elemen bernilai True. Keduanya adalah padanan kuantor semua dan ada pada logika, dan keduanya meringkas array boolean menjadi satu nilai keputusan.

python
import numpy as np

suhu = np.array([18, 21, 24, 27])
print(np.all(suhu > 15))
print(np.any(suhu > 25))
print(np.any(suhu > 30))
text Keluaran
True
True
False

Pernyataan pertama menguji apakah seluruh suhu di atas 15, dan keempatnya memenuhi sehingga hasilnya True. Pernyataan kedua menguji apakah ada suhu di atas 25, dan 27 memenuhi. Pernyataan ketiga menguji ambang 30 yang tidak terlampaui oleh satu elemen pun, sehingga hasilnya False. Kedua fungsi ini bekerja pada array boolean apa pun, termasuk hasil penggabungan & dan |.

Kedua fungsi juga tersedia sebagai metode array, yaitu (suhu > 15).all() dan (suhu > 15).any(). Bentuk metode inilah yang disarankan pesan ValueError pada bagian sebelumnya, dan hasilnya sama dengan bentuk fungsi np.all serta np.any. Bila array boolean dibentuk dari penggabungan & dan |, hasil penggabungan tersebut dapat langsung dipanggil dengan salah satunya.

Kesalahan umum#

Kesalahan pertama adalah menggabungkan kondisi array dengan and, or, atau not. Python menuntut satu nilai kebenaran per operand, sehingga array multi-elemen memicu ValueError dengan pesan ambiguous. Gunakan &, |, dan ~ yang bekerja per elemen.

Kesalahan kedua adalah melupakan tanda kurung pada tiap kondisi. Ekspresi suhu >= 21 & lembab < 80 dievaluasi dengan 21 & lembab terlebih dahulu, sehingga hasilnya tidak sesuai maksud dan bahkan bisa berupa error tanpa petunjuk yang jelas. Bentuk yang benar selalu memisahkan tiap kondisi dengan tanda kurung, yaitu (suhu >= 21) & (lembab < 80).

Kesalahan ketiga adalah mengira perbandingan == antar array menghasilkan satu nilai boolean. Hasilnya adalah array boolean per elemen, dan pemakaian langsung pada if akan memicu error keambiguan yang sama dengan and. Pemeriksaannya sederhana, yaitu melihat dtype hasil perbandingan, dan bila nilainya bool, hasilnya array boolean yang perlu diringkas dengan np.all atau np.any terlebih dahulu.

Ringkasan#

  • Operator perbandingan pada array menghasilkan array boolean per elemen, baik terhadap skalar maupun terhadap array sebangun.
  • Kondisi digabung dengan & untuk dan, | untuk atau, dan ~ untuk negasi, dan setiap kondisi wajib dibungkus tanda kurung karena & dievaluasi lebih dahulu daripada operator perbandingan.
  • Kata kunci and gagal pada array multi-elemen karena Python menuntut satu nilai kebenaran, dan pesan ValueError-nya menyarankan any serta all.
  • np.all bernilai True bila semua elemen bernilai True, sedangkan np.any bernilai True bila sedikitnya satu elemen bernilai True.

Referensi#