2011-07-02 116 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'或某些類似的值來指示缺失的數據?Numpy屏蔽陣列 - 指示缺失值

回答

4

您是否從文本文件或類似文件中獲取數據?如果是的話,我會建議使用genfromtxt功能直接指定您的屏蔽值:

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) 

我想在你的榜樣的問題是,你正在使用初始化數組numpy的蟒蛇列表具有異質類型(浮動和一個字符串)。這些值被強制爲一個numpy數組中的字符串,但masked_values函數使用浮點相等性來產生奇怪的結果。

這裏是通過創建對象D型數組來克服這個的一種方法:

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

你可能更喜歡第一個解決方案,因爲結果具有浮動D型。

+0

我想保留我的數組(在內存中)缺少的值信息。我使用掩碼的目的是讓數組可以平均,忽略缺失的值。正如ma文檔中指出的,ma的目的是允許處理缺失或無效值的數據。在真實數據系列「不適用」中,「無」或類似標記用於標記缺失值。 「fill_value」選項是否提供了任何方式來實現我的目標? –

+0

@Dick:是的,上述兩種方法都可以完成你所需要的。它們都保留了元素3丟失的信息(如果這是你所關心的,fill_value並不重要)。例如,你可以調用'a.mean()'或'e.mean()',看看結果是'3.33'。在上面的例子中,無論數據序列用於缺失值的字符/字符串都可以用來代替「NA」。 – ars

0

該解決方案有效,它確實強制創建數組副本。

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