Numpy掩码数组 - 指示缺失值

6 投票
2 回答
3844 浏览
提问于 2025-04-16 20:42
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'或类似的值来表示缺失的数据呢?

2 个回答

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
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数组的python列表里有不同类型的数据(有浮点数和字符串)。在numpy数组中,这些值会被强制转换成字符串,但masked_values这个函数是用浮点数的相等性来处理的,这就导致了奇怪的结果。

这里有一种方法可以解决这个问题,就是创建一个对象类型的数组:

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

你可能会更喜欢第一个解决方案,因为结果是浮点数类型。

撰写回答