Numpy掩码数组masked arrays,这一篇就够了

Posted 程序媛一枚~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Numpy掩码数组masked arrays,这一篇就够了相关的知识,希望对你有一定的参考价值。

  • MaskedArray是numpy.ndarray的一个子类,因此它继承了索引和切片机制。

1. 什么是掩码数组

掩码数组是包括可能缺少或无效项的数组。numpy.ma模块为numpy提供了一个几乎可以替代numpy的替代品,它支持带掩码的数据数组。

数组计算时,数据集可能是不完整的或者由于存在无效数据而使得计算结果是被污染的。 例如,传感器可能无法记录数据,或记录了无效值。ma模块通过引入屏蔽数组,提供了一种解决此问题的方便方法。

掩码数组是标准numpy.ndarray和掩码的组合。掩码可以是nomask,表示关联数组的值无效,也可以是boolean数组,用于确定关联数组的每个元素的值是否有效。 当掩码的某个元素为False时,关联数组的相应元素有效,并被称为未掩码。当掩码的一个元素为真时,关联数组的相应元素被称为掩码(无效)。
该包确保在计算中不使用屏蔽项。

2.示例

概念有点抽象,看一个例子感受一下:

2.1 一个例子走进掩码数组

掩码数组可以帮助进行numpy的相应运算而忽略无效值

# 掩码数组可以帮助进行numpy的相应运算而忽略无效值
import numpy as np
import numpy.ma as ma

x = np.array([1, 2, 3, -1, 5])

# 假设上述数组x中第4个值是无效的,那么可以建立一个掩码数组如下mx
mx = ma.masked_array(x, mask=[0, 0, 0, 1, 0])

# 接下来就可以忽略无效数据,而计算数据集x的平均值了
print(mx.mean())
# 得到结果2.75

ma模块的主要特性是MaskedArray类,它是numpy.ndarray的一个子类。
numpy.ma模块可用作numpy的附加模块;

2.2 创建一个数组第二个值是无效的

import numpy.ma as ma
# 创建一个数组第二个值是无效的
y = ma.array([1, 2, 3], mask = [0, 1, 0])

2.3 创建一个数组所有靠近1.e20的值是无效的

import numpy.ma as ma
# 创建一个数组所有靠近1.e20的值是无效的
z = ma.masked_values([1.0, 1.e20, 3.0, 4.0], 1.e20)

2.4 只获取有效项

import numpy.ma as ma

# 只获取有效项法一
x = ma.array([[1, 2], [3, 4]], mask=[[0, 1], [1, 0]])
print(x[~x.mask])
# masked_array(data=[1, 4],
#              mask=[False, False],
#              fill_value=999999)

# 只获取有效项法2
print(x.compressed())
# array([1, 4])

2.5 取消标识无效(注意标识硬编码的需要先软化在标识)

import numpy.ma as ma

# 取消标识项无效
x = ma.array([1, 2, 3], mask=[0, 0, 1])
print(x)
# masked_array(data=[1, 2, --],
#              mask=[False, False, True],
#              fill_value=999999)
x[-1] = 5
print(x)
# masked_array(data=[1, 2, 5],
#              mask=[False, False, False],
#              fill_value=999999)

x = ma.array([1, 2, 3], mask=[0, 0, 1], hard_mask=True)
print(x)
# masked_array(data=[1, 2, --],
#              mask=[False, False, True],
#              fill_value=999999)
x[-1] = 5
print(x)
# masked_array(data=[1, 2, --],
#              mask=[False, False, True],
#              fill_value=999999)
print(x.soften_mask())
# masked_array(data=[1, 2, --],
#              mask=[False, False, True],
#              fill_value=999999)
x[-1] = 5
print(x)
# masked_array(data=[1, 2, 5],
#              mask=[False, False, False],
#              fill_value=999999)
print(x.harden_mask())
# masked_array(data=[1, 2, 5],
#              mask=[False, False, False],
#              fill_value=999999)

# 硬编码的需要先软化才可以标识取消无效
x = ma.array([1, 2, 3], mask=[0, 0, 1])
print(x)
# masked_array(data=[1, 2, --],
#              mask=[False, False,  True],
#              fill_value=999999)
x.mask = ma.nomask
print(x)
# masked_array(data=[1, 2, 3],
#              mask=[False, False, False],
#              fill_value=999999)

2.6 修改Masked Array标记项为无效项

import numpy.ma as ma

# 修改Masked Array标记项为无效项
x = ma.array([1, 2, 3])
x[0] = ma.masked
print(x)
# masked_array(data=[--, 2, 3],
#              mask=[ True, False, False],
#              fill_value=999999)
y = ma.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y[(0, 1, 2), (1, 2, 0)] = ma.masked
print(y)
# masked_array(
#     data=[[1, --, 3],
#           [4, 5, --],
#           [--, 8, 9]],
#     mask=[[False,  True, False],
#           [False, False,  True],
#           [ True, False, False]],
#     fill_value=999999)
z = ma.array([1, 2, 3, 4])
z[:-2] = ma.masked
print(z)
# masked_array(data=[--, --, 3, 4],
#              mask=[ True,  True, False, False],
#              fill_value=999999)

参考

以上是关于Numpy掩码数组masked arrays,这一篇就够了的主要内容,如果未能解决你的问题,请参考以下文章

通过布尔掩码数组选择numpy数组的元素

如何在 Numpy 中将索引数组转换为掩码数组?

如何将圆盘形掩码应用于 NumPy 数组?

如何对 NumPy 数组执行逐元素布尔运算 [重复]

如何对 NumPy 数组执行逐元素布尔运算 [重复]

如果满足条件,则替换 Numpy 元素