2011-07-02 19 views
5
import numpy as np 
import numpy.ma as ma 

"""This operates as expected with one value masked""" 
a = [0., 1., 1.e20, 9.] 
error_value = 1.e20 
b = ma.masked_values(a, error_value) 
print b 

"""This does not, all values are masked """ 
d = [0., 1., 'NA', 9.] 
error_value = 'NA' 
e = ma.masked_values(d, error_value) 
print e 

'Nan', 'NA', 'None' veya eksik verileri belirtmek için bazı benzer değerleri nasıl kullanabilirim?Numune maskeli diziler - eksik değerleri belirten

cevap

4

Verilerinizi bir metin dosyasından mı yoksa benzer birinden mi alıyorsunuz? Ben senin örnekte sorun numpy diziyi başlatmak için kullandığınız piton listesi (heterojen tip olmasıdır düşünüyorum

In [149]: f = StringIO('0.0, 1.0, NA, 9.0') 

In [150]: a = np.genfromtxt(f, delimiter=',', missing_values='NA', usemask=True) 

In [151]: a 
Out[151]: 
masked_array(data = [0.0 1.0 -- 9.0], 
      mask = [False False True False], 
     fill_value = 1e+20) 

: Öyleyse, doğrudan maskeli değeri belirtmek için genfromtxt işlevini kullanarak öneririm yüzer ve bir ip). Değerler, numpy dizisindeki bir dizeye zorlanır, ancak masked_values işlevi, garip sonuçları veren kayan nokta eşitliği kullanır. sonuç float d_type beri

In [152]: d = np.array([0., 1., 'NA', 9.], dtype=object) 

In [153]: e = ma.masked_values(d, 'NA') 

In [154]: e 
Out[154]: 
masked_array(data = [0.0 1.0 -- 9.0], 
      mask = [False False True False], 
     fill_value = ?) 

İlk çözümü tercih edilebilir:

Burada nesne d_type içeren bir dizi oluşturarak bu üstesinden gelmek için tek yoldur.

+0

Dizimde (bellekte) eksik değer bilgilerini korumak istiyorum. Bir maskeyi kullanmamdaki amacım, dizinin, eksik değerleri göz ardı ederek ortalaması alınabilmesidir. Bilgisayarlarda belirtildiği gibi, ma'nın amacı, verilerin eksik veya geçersiz değerlerle işlenmesine izin vermektir. 'NA' gerçek veri dizisinde, eksik değerleri işaretlemek için 'Yok' veya benzeri kullanılır. "Fill_value" seçeneği hedefimi gerçekleştirmenin herhangi bir yolunu sunuyor mu? –

+0

@Dick: Evet, yukarıdaki her iki yöntem de ihtiyacınız olanı gerçekleştirir. Her ikisi de, öğenin 3 eksik olduğu bilgileri korurlar (tüm ilgilendiğiniz takdirde fill_value değeri önemli değildir). Örneğin, “a.mean()” veya “e.mean()” diyebilirsiniz ve sonucun “3.33” olduğunu görebilirsiniz. Yukarıdaki örneklerde "NA'" yerine, veri dizinizin eksik değerler için kullandığı karakter/dizgi ne olursa olsun kullanılabilir. – ars

0

Bu çözüm işe yarar, dizinin kopyasının oluşturulmasını zorlar.

a_true = (a == 'NA') 

a[a_true] = 1.e20 

a = a.astype(float) 

print a 

error_value = 1.e20 

b = ma.masked_values(a, error_value) 

print b 
İlgili konular