Garfield
YZF Admin
Eksik sayısal değerleri bulma
NumPy'de eksik sayısal değerleri bulmak için diziyi
np.isnan() işlevine verin. Sonuç, her eleman için True veya False üreten bir Boolean dizisidir; True olan konumlar NaN değerlerini gösterir. Bu maskeyi hem eksik değerlerin yerini bulmak hem de diziyi temizlemek için kullanabilirsiniz.Temel kullanım
Ön koşul olarak NumPy'nin kurulu ve içe aktarılmış olması gerekir. Aşağıdaki örnekte
np.nan, eksik sayısal değeri temsil eder:
Python:
import numpy as np
sayilar = np.array([12.5, np.nan, 8.0, np.nan, 21.3])
eksik_mi = np.isnan(sayilar)
print(eksik_mi)
print("Eksik değer sayısı:", np.sum(eksik_mi))
print("Eksik değerlerin konumları:", np.where(eksik_mi)[0])
Bu kodun beklenen çıktısı şöyledir:
Kod:
[False True False True False]
Eksik değer sayısı: 2
Eksik değerlerin konumları: [1 3]
Burada ikinci ve dördüncü eleman
NaN olduğu için karşılık gelen maskelerde True görülür. np.where(eksik_mi)[0] ifadesi, eksik değerlerin sıfırdan başlayan indislerini verir. Bu sonuç eksik değerlerin bulunduğunu gösterir; bu değerlerin neden eksik olduğunu veya hangi gerçek değerin yazılması gerektiğini göstermez.Eksik değerleri seçmek veya saymak
Boolean maske, dizinin içinden eksik ya da eksik olmayan değerleri ayırmak için doğrudan kullanılabilir:
Python:
import numpy as np
sayilar = np.array([12.5, np.nan, 8.0, np.nan, 21.3])
eksik_mi = np.isnan(sayilar)
print("Eksik değerler:", sayilar[eksik_mi])
print("Eksik olmayan değerler:", sayilar[~eksik_mi])
print("Eksik değer var mı?", np.any(eksik_mi))
print("Tüm değerler eksik mi?", np.all(eksik_mi))
Beklenen sonuç:
Kod:
Eksik değerler: [nan nan]
Eksik olmayan değerler: [12.5 8. 21.3]
Eksik değer var mı? True
Tüm değerler eksik mi? False
np.any() en az bir NaN olup olmadığını, np.all() ise bütün elemanların NaN olup olmadığını kontrol eder. Eksik olmayan değerlerin tamamını almak için maskenin tersini ~eksik_mi şeklinde kullanabilirsiniz.Eksik değerleri başka bir değerle değiştirme
Eksik değerleri örneğin sıfırla değiştirmek istiyorsanız önce maskeyi oluşturup yalnızca
True olan konumlara atama yapın:
Python:
import numpy as np
sayilar = np.array([12.5, np.nan, 8.0, np.nan, 21.3])
sayilar[np.isnan(sayilar)] = 0
print(sayilar)
Çıktı:
Kod:
[12.5 0. 8. 0. 21.3]
Sıfır her veri seti için doğru bir anlam taşımaz. Ortalama, medyan veya alanın gerektirdiği başka bir değerle değiştirme kararı veri bağlamına göre verilmelidir;
np.isnan() yalnızca eksik konumları bulur.NaN, sonsuz değer ve diğer eksik gösterimleri arasındaki fark
np.isnan() yalnızca NaN değerlerini işaretler. Pozitif veya negatif sonsuzluk eksik değer değildir; ancak hesaplamayı bozabileceği için ayrıca kontrol edilebilir. Bunun için np.isfinite() kullanılabilir.| Kontrol | Bulduğu durum | Örnek kullanım |
|---|---|---|
np.isnan(x) | NaN olan elemanlar | Eksik sayısal değerleri bulma |
np.isfinite(x) | Sonlu olmayan NaN ve sonsuz değerler dışındaki elemanları ayırma | Hesaplamaya uygun değerleri seçme |
x == None | Python None değerini karşılaştırma | NaN kontrolü yerine geçmez |
np.isnan(np.array([1.0, np.inf, -np.inf])) sonucu bütün elemanlar için False olur; çünkü sonsuzluk NaN değildir. Hem NaN hem de sonsuz değerleri geçersiz saymak istiyorsanız şu maskeyi kullanabilirsiniz:
Python:
import numpy as np
sayilar = np.array([10.0, np.nan, np.inf, -np.inf, 5.0])
gecerli_mi = np.isfinite(sayilar)
print(gecerli_mi)
print(sayilar[gecerli_mi])
Çıktı:
Kod:
[ True False False False True]
[10. 5.]
Dikkat edilmesi gereken veri türü
np.isnan() sayısal dizilerde doğrudan çalışır. Dizi metin, karma nesne veya uygun olmayan bir veri türü içeriyorsa NumPy bir tür hatası verebilir. Böyle bir durumda önce verilerin gerçekten sayısal olup olmadığını ve eksik değerlerin NaN olarak mı, yoksa boş metin veya None olarak mı tutulduğunu kontrol edin.Örneğin boş metin
NaN değildir. Bu nedenle yalnızca np.isnan() çağırmak, veri kaynağındaki tüm eksik gösterimlerini yakalamaz. Önce boş metinleri ve benzeri özel işaretleri uygun biçimde np.nan değerine dönüştürmek, ardından maskeyi uygulamak gerekir.