Chapter NaN dan Infinity menunjukkan bahwa perbandingan == tidak berguna untuk mendeteksi nan. NumPy menyediakan tiga detektor per elemen yang bekerja secara vectorization: np.isnan untuk nan, np.isinf untuk inf dan -inf, serta np.isfinite untuk nilai berhingga yang valid. Ketiganya mengembalikan array boolean berbentuk sama dengan array asalnya.
Bab ini membaca pola ketiganya pada satu array uji, memilih detektor yang tepat untuk keperluan pembersihan, dan menutup dengan satu aturan yang sering terlewat: hanya array bertipe float yang bisa menampung nan dan inf.
Tabel Kebenaran Tiga Detektor #
import numpy as np
a = np.array([1.0, np.nan, np.inf, -np.inf])
print("nilai :", a)
print("isnan :", np.isnan(a))
print("isinf :", np.isinf(a))
print("isfinite :", np.isfinite(a))
print("isfinite == ~(isnan | isinf):", np.array_equal(np.isfinite(a), ~(np.isnan(a) | np.isinf(a))))Output yang Dihasilkan:
nilai : [ 1. nan inf -inf]
isnan : [False True False False]
isinf : [False False True True]
isfinite : [ True False False False]
isfinite == ~(isnan | isinf): TrueHasil ketiga detektor pada array uji dapat dirangkum menjadi tabel kebenaran:
| nilai | isnan | isinf | isfinite |
|---|---|---|---|
1.0 | False | False | True |
nan | True | False | False |
inf | False | True | False |
-inf | False | True | False |
Mari kita bedah blok di atas:
- Baris 3: array uji berisi empat wajah nilai float — satu nilai biasa,
nan, dan dua arah tak hingga. - Baris 5 (
np.isnan(a)): hanya posisinanyang bernilaiTrue;infbukannan. - Baris 6 (
np.isinf(a)): kedua arah tak hingga ditandai sekaligus, tanpa membedakan tanda. - Baris 7-8:
isfiniteberlawanan dengan gabungan dua detektor lain; kesetaraan itu dibuktikannp.array_equalyang menghasilkanTrue.
Pola yang perlu diingat: setiap elemen masuk tepat satu dari tiga kategori — valid, nan, atau tak hingga. Karena isfinite adalah negasi dari isnan | isinf, ketiganya tidak pernah bertumpang tindih.
Memilih Detektor untuk Pembersihan #
Untuk keperluan pembersihan data, np.isfinite biasanya paling pas: satu fungsi mengenali kedua jenis nilai tidak valid sekaligus:
import numpy as np
pengukuran = np.array([27.5, np.nan, np.inf, 26.9, -np.inf])
print("isnan :", np.isnan(pengukuran))
print("isinf :", np.isinf(pengukuran))
print("isfinite :", np.isfinite(pengukuran))
print("total tidak valid:", int((~np.isfinite(pengukuran)).sum()))Output yang Dihasilkan:
isnan : [False True False False False]
isinf : [False False True False True]
isfinite : [ True False False True False]
total tidak valid: 3Penjelasan tiap baris:
- Baris 3: lima pembacaan; dua di antaranya tak hingga dan satu
nan. - Baris 4-6: ketiga detektor berjalan pada array yang sama; hanya
isfiniteyang mengenali posisi26.9sebagai satu-satunya nilai layak hitung. - Baris 7 (
~np.isfinite(...)): negasi membalik mask, sehinggaTruemenandai elemen tidak valid — baiknanmaupuninf— dan penjumlahannya menghasilkan 3.
Pemilihan detektor bisa diringkas menjadi tiga pertanyaan:
- Cari hanya
nan? Gunakannp.isnan. - Cari hanya tak hingga? Gunakan
np.isinf. - Tangani semua yang tidak valid? Gunakan
~np.isfinite.
Cara ketiga inilah yang menjadi fondasi filtering pada Chapter Filtering Nilai Tidak Valid.
dtype Harus Float #
Aturan penting yang sering terlewat: nan dan inf hanya bisa disimpan di array float. Array bulat tidak punya representasi untuk keduanya, dan interpreter menolak penugasan itu:
import numpy as np
skor = np.array([80, 90, 70])
print(skor.dtype)
try:
skor[0] = np.nan
except ValueError as e:
print("ValueError:", e)
skor_f = skor.astype(np.float64)
skor_f[0] = np.nan
print(skor_f)Output yang Dihasilkan:
int64
ValueError: cannot convert float NaN to integer
[nan 90. 70.]Mari kita telaah:
- Baris 3-4: array yang dibuat dari bilangan bulat bertipe
int64. - Baris 5-8: penugasan
np.nanke elemenint64ditolak interpreter denganValueError: cannot convert float NaN to integer; bloktry/exceptmenjaga script tetap berjalan. - Baris 9 (
astype(np.float64)): array disalin ke tipe float — detail konversi dibahas pada Chapter Konversi Tipe Data. - Baris 10-11: setelah menjadi
float64, posisinandapat disimpan; tampilannyanandiikuti angka bulat berformat float (90.,70.).
Ketiga detektor ini adalah perkakas utama seluruh bab berikutnya: penghitungan pada Chapter Memeriksa Nilai Valid, penyaringan pada Chapter Filtering Nilai Tidak Valid, hingga penggantian nilai pada Chapter Mengganti Nilai Tertentu semuanya bertumpu pada mask boolean yang dihasilkannya.