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