Python Numpy掩码数组-指示缺少的值

Python Numpy掩码数组-指示缺少的值,python,arrays,numpy,Python,Arrays,Numpy,如何使用“nan”、“NA”、“None”或类似值来表示缺少的数据 您是否从文本文件或类似文件获取数据?如果是这样,我建议直接使用函数来指定屏蔽值: 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

如何使用“nan”、“NA”、“None”或类似值来表示缺少的数据

您是否从文本文件或类似文件获取数据?如果是这样,我建议直接使用函数来指定屏蔽值:

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
我认为您的示例中的问题是,用于初始化numpy数组的python列表具有异构类型(float和字符串)。这些值被强制为numpy数组中的字符串,但该函数使用浮点等式产生奇怪的结果

下面是一种克服此问题的方法,方法是创建一个具有object dtype的数组:

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)

您可能更喜欢第一个解决方案,因为结果有一个float数据类型。

此解决方案有效,它确实强制创建数组的副本

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

我想保留数组(内存中)中缺少的值信息。我使用掩码的目的是使数组可以平均,忽略缺少的值。正如ma文件中指出的,ma的目的是允许处理缺失或无效值的数据。在实际数据系列中,“NA”、“None”或类似的数据通常用于标记缺失值。“填充值”选项是否为实现我的目标提供了任何方法?@Dick:是的,上述两种方法都能满足你的需要。它们都保留了元素3丢失的信息(如果您只关心填充值,那么填充值就不那么重要了)。例如,您可以调用
a.mean()
e.mean()
并查看结果是
3.33
。在上面的示例中,可以使用数据系列用于缺失值的任何字符/字符串来代替
'NA'
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