2011-07-02 10 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 

Jak mogę użyć "nan", "NA", "Brak" lub jakiejś podobnej wartości do wskazania brakujących danych?Zablokowane tablice Numpy - wskazujące brakujące wartości

Odpowiedz

4

Czy otrzymujesz dane z pliku tekstowego lub podobnego? Jeśli tak, to proponuję przy użyciu funkcji genfromtxt bezpośrednio określić wartość zamaskowanego:

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) 

Myślę, że problem w przykładzie jest to, że lista pyton używasz do zainicjowania tablicy numpy ma heterogenicznych typów (pływaki i sznur). Wartości są przekształcane na ciągi w tablicy numpy, ale funkcja masked_values wykorzystuje równość punktów zmiennoprzecinkowych, co daje dziwne wyniki.

Oto jeden ze sposobów rozwiązania tego tworząc tablicę z obiektu dtype:

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 = ?) 

Może wolisz pierwsze rozwiązanie, ponieważ wynik ma dtype pływaka.

+0

Chcę zachować brakującą wartość w mojej tablicy (w pamięci). Moim celem używania maski jest uśrednianie macierzy, ignorując brakujące wartości. Jak wskazano w ma dokumentach celem ma jest umożliwienie przetwarzania danych z brakującymi lub nieprawidłowymi wartościami. W prawdziwych seriach danych "NA", do oznaczania brakujących wartości stosowany jest "Brak" lub podobny. Czy opcja "fill_value" zapewnia jakiś sposób osiągnięcia mojego celu? –

+0

@Dick: Tak, obie powyższe metody zapewniają to, czego potrzebujesz. Oboje zachowują informację, że brakuje elementu 3 (wartość fill_name nie jest tak ważna, jeśli o to ci chodzi). Na przykład możesz wywołać 'a.mean()' lub 'e.mean()' i zobaczyć, że wynikiem jest '3.33'. Bez względu na to, jaki znak/ciąg używa seria danych dla brakujących wartości, zamiast "NA" w powyższych przykładach można użyć. – ars

0

To rozwiązanie działa, wymusza tworzenie kopii tablicy.

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 
Powiązane problemy