Satu kondisi jarang cukup. Penentuan siswa berprestasi biasanya menuntut dua syarat sekaligus — nilai mencapai batas minimal dan kehadiran penuh — sementara daftar siswa yang perlu dikejar kehadirannya cukup memenuhi salah satu syarat saja. Chapter Operasi Perbandingan menghasilkan mask per kondisi; chapter ini menggabungkan mask-mask itu menjadi satu keputusan.
Agenda bab:
- Menggabungkan mask dengan
&(dan),|(atau), dan~(negasi). - Jebakan
and/orPython serta kewajiban tanda kurung. - Menyimpulkan seluruh array dengan
np.alldannp.any.
Menggabungkan mask dengan &, |, dan ~ #
Ketiga operator boolean NumPy bekerja per elemen pada dua mask (atau satu mask untuk ~). Kita gabungkan mask kelulusan nilai dengan mask kehadiran penuh:
import numpy as np
nilai = np.array([80, 65, 90, 75, 60])
kehadiran = np.array([1, 1, 0, 1, 1])
lulus_nilai = nilai >= 75
penuh_kehadiran = kehadiran == 1
print(lulus_nilai)
print(penuh_kehadiran)
print(lulus_nilai & penuh_kehadiran)
print(lulus_nilai | penuh_kehadiran)
print(~lulus_nilai)
print(np.array_equal(~(lulus_nilai & penuh_kehadiran), ~lulus_nilai | ~penuh_kehadiran))Output yang Dihasilkan:
[ True False True True False]
[ True True False True True]
[ True False False True False]
[ True True True True True]
[False True False False True]
True- Baris 4-5: dua mask berbentuk
(5,)— mask tidak harus lahir dari>=saja;==,<, dan kawan-kawan sama saja. - Baris 9 (
lulus_nilai & penuh_kehadiran):Truehanya pada posisi yang kedua masknyaTrue— siswa pertama dan keempat memenuhi dua syarat sekaligus. - Baris 10 (
lulus_nilai | penuh_kehadiran):Trueketika salah satu syarat terpenuhi; semua siswa memenuhi minimal satu syarat. - Baris 11 (
~lulus_nilai):~membalik setiap nilai — inilah daftar siswa yang gagal di syarat nilai. - Baris 12: hasil
Truemembuktikan hukum De Morgan berlaku pada mask:~(A & B)identik dengan~A | ~B.
| Operator | Arti pada mask | Padanan logika |
|---|---|---|
& | keduanya benar | AND |
| | salah satu benar | OR |
~ | membalik nilai | NOT |
Kurung wajib dan jebakan and/or #
Dua kebiasaan dari Python biasa justru menjebak ketika dipakai pada array. Pertama, kata kunci and/or tidak bisa dipakai pada mask. Kedua, & dihitung lebih dahulu dibanding operator perbandingan, sehingga tanda kurung menjadi wajib:
import numpy as np
nilai = np.array([80, 65, 90, 75, 60])
kehadiran = np.array([1, 1, 0, 1, 1])
try:
hasil = (nilai >= 75) and (kehadiran == 1)
except ValueError as e:
print("ValueError:", e)
tanpa_kurung = nilai >= 75 & kehadiran
print(tanpa_kurung)
dengan_kurung = (nilai >= 75) & (kehadiran == 1)
print(dengan_kurung)Output yang Dihasilkan:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
[ True True True True True]
[ True False False True False]- Blok
try(baris 5-8):andmenuntut satu nilai kebenaran, sedangkan mask berisi banyak nilai. Python menolak menebak dan melemparValueError; pesannya sendiri sudah menyarankana.any()ataua.all(). - Baris 9 (
nilai >= 75 & kehadiran): karena&dihitung lebih dahulu, ekspresi ini sama artinya dengannilai >= (75 & kehadiran). Hasilnya kelima posisiTrue— jawaban yang keliru tanpa satu pun pesan kesalahan. - Baris 11 (
(nilai >= 75) & (kehadiran == 1)): dengan tanda kurung di kedua kondisi, hasilnya benar dan sama dengan baris 9 pada bagian sebelumnya.
Menyimpulkan dengan np.all dan np.any #
np.all dan np.any memadatkan sebuah mask menjadi kesimpulan: np.all bernilai True hanya bila semua elemen True, sedangkan np.any cukup satu elemen True. Keduanya juga menerima axis agar kesimpulan dihitung per baris atau per kolom:
import numpy as np
banyak = np.array([
[75, 80, 90],
[70, 60, 95],
[65, 55, 40],
])
print(np.all(banyak >= 75, axis=1))
print(np.any(banyak >= 75, axis=0))Output yang Dihasilkan:
[ True False False]
[ True True True]- Baris 8 (
np.all(..., axis=1)):axis=1berarti kesimpulan dihitung melintasi kolom, sehingga kita mendapat satu jawaban per baris — baris mana yang semua ulangannya mencapai 75. Hanya siswa pertama yang lulus penuh. - Baris 9 (
np.any(..., axis=0)):axis=0menghitung per kolom — ulangan mana yang paling sedikit satu nilainya mencapai 75. Ketiga kolom memenuhi. - Tanpa argumen
axis, kedua fungsi mengembalikan satubooluntuk seluruh array — seperti yang dipakai pesanValueErrorpada bagian sebelumnya sebagai saran penggantiand.