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 #

python
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:

text
nilai    : [  1.  nan  inf -inf]
isnan    : [False  True False False]
isinf    : [False False  True  True]
isfinite : [ True False False False]
isfinite == ~(isnan | isinf): True

Hasil ketiga detektor pada array uji dapat dirangkum menjadi tabel kebenaran:

nilaiisnanisinfisfinite
1.0FalseFalseTrue
nanTrueFalseFalse
infFalseTrueFalse
-infFalseTrueFalse

Mari kita bedah blok di atas:

  1. Baris 3: array uji berisi empat wajah nilai float — satu nilai biasa, nan, dan dua arah tak hingga.
  2. Baris 5 (np.isnan(a)): hanya posisi nan yang bernilai True; inf bukan nan.
  3. Baris 6 (np.isinf(a)): kedua arah tak hingga ditandai sekaligus, tanpa membedakan tanda.
  4. Baris 7-8: isfinite berlawanan dengan gabungan dua detektor lain; kesetaraan itu dibuktikan np.array_equal yang menghasilkan True.

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:

python
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:

text
isnan    : [False  True False False False]
isinf    : [False False  True False  True]
isfinite : [ True False False  True False]
total tidak valid: 3

Penjelasan tiap baris:

  1. Baris 3: lima pembacaan; dua di antaranya tak hingga dan satu nan.
  2. Baris 4-6: ketiga detektor berjalan pada array yang sama; hanya isfinite yang mengenali posisi 26.9 sebagai satu-satunya nilai layak hitung.
  3. Baris 7 (~np.isfinite(...)): negasi membalik mask, sehingga True menandai elemen tidak valid — baik nan maupun inf — dan penjumlahannya menghasilkan 3.

Pemilihan detektor bisa diringkas menjadi tiga pertanyaan:

  1. Cari hanya nan? Gunakan np.isnan.
  2. Cari hanya tak hingga? Gunakan np.isinf.
  3. 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:

python
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:

text
int64
ValueError: cannot convert float NaN to integer
[nan 90. 70.]

Mari kita telaah:

  1. Baris 3-4: array yang dibuat dari bilangan bulat bertipe int64.
  2. Baris 5-8: penugasan np.nan ke elemen int64 ditolak interpreter dengan ValueError: cannot convert float NaN to integer; blok try/except menjaga script tetap berjalan.
  3. Baris 9 (astype(np.float64)): array disalin ke tipe float — detail konversi dibahas pada Chapter Konversi Tipe Data.
  4. Baris 10-11: setelah menjadi float64, posisi nan dapat disimpan; tampilannya nan diikuti 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.