2011-07-15 25 views
19

Numarayı NaN ile değiştirip numpy.nan_to_num gibi bir işlevi arıyorum, tersi hariç.Numpy - Sayıyı NaN ile değiştirin

Her biri benzersiz bir NoDataValue tanımlayabildiğinden, farklı diziler işlendikçe sayı değişebilir. Sözlükleri kullanan insanları görüyorum, ancak diziler geniş ve hem pozitif hem de negatif floatlarla dolu. Anahtarlar oluşturmak için bunların tümünü bir şeye yüklemenin etkili olmadığından şüpheleniyorum.

Herhangi birini() veya tümünü() kullandığımı gerektiren aşağıdaki ve uyuşuklukları kullanmayı denedim. Öğeyi bilge bir şekilde yinelemem gerektiğini anlıyorum, ancak yerleşik bir işlevin bunu başarabileceğini umuyorum.

def replaceNoData(scanBlock, NDV): 
    for n, i in enumerate(array): 
     if i == NDV: 
      scanBlock[n] = numpy.nan 

NDV, GDAL'nin veri değeri değildir ve dizi bir sayı dizisidir.

Maskelenmiş bir dizilim belki de gitmenin yolu mu?

+1

için bir endeks olarak kullanılabilecek bir boolean dizisi üretecek. Düzgün çalışmıyor mu? –

+0

@Chris Gregg Bu çözümün bir miktar girintiye ihtiyacı var, diziyi döndürmesi gerekmiyor (yerinde olduğu için), muhtemelen np.array ile karışıklıktan kaçınmak için 'array' değişkenini kullanmaktan kaçınmalı, ama en önemlisi korkunç olacak Tipik numpy indeksleme ve yayın ile karşılaştırıldığında yavaş. – Paul

+0

@Paul Benim endişem hız oldu, aşağıdaki cevap için çok teşekkürler. Kodları daha net yapmak için değişkenleri kullandım, diziyi kullanmaktan kaçınmak istiyorum. – Jzl5325

cevap

35
A[A==NDV]=numpy.nan 

A == NDV Sana sağlamak çözümde yanlış ne olduğunu anlamak emin değilim A

+0

numpy.nan özel bir değeri var mı? Bunu Google aracılığıyla bulamıyorum ... – alwaysaskingquestions

+1

Kullanımdaki veri türü için geçerli aralığın dışında kalan özel bir bit dizisidir. Eksik verileri veya geçerli bir değer üretmeyen bir matematik hatasının sonucunu belirtmek için kullanılır. Umarım bu yardımcı olur: https://en.wikipedia.org/wiki/NaN – Paul

+0

Evet evet! teşekkür ederim :) – alwaysaskingquestions