前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Numpy 修炼之道 (11)—— 掩码数组

Numpy 修炼之道 (11)—— 掩码数组

作者头像
abs_zero
修改2018-05-26 14:37:18
1.6K0
修改2018-05-26 14:37:18
举报
文章被收录于专栏:AI派

推荐阅读时间:8min~10min 文章内容:Numpy掩码数组(Numpy异常值、缺失值处理)

简介

有时候数据集中存在缺失、异常或者无效的数值,我们可以标记该元素为被屏蔽(无效)状态。

代码语言:javascript
复制
>>> import numpy as np
>>> import numpy.ma as ma
>>> x = np.array([1, 2, 3, -99, 5])
>>> x
array([  1,   2,   3, -99,   5])

现在可以创造一个掩码数组(标记第四个元素为无效状态)。

代码语言:javascript
复制
>>> mx = ma.masked_array(x, mask=[0, 0, 0, 1, 0])
>>> mx
masked_array(data = [1 2 3 -- 5],
 mask = [False False False True False],
 fill_value = 999999)

接下来可以计算平均值而不用考虑无效数据。

代码语言:javascript
复制
>>> mx.mean()
2.75

访问掩码

可通过其mask属性访问掩码数组的掩码。我们必须记住,掩码中的True条目表示无效数据。

代码语言:javascript
复制
>>> mx
masked_array(data = [1 2 3 -- 5],
             mask = [False False False  True False],
       fill_value = 999999)

>>> mx.mask
array([False, False, False,  True, False], dtype=bool)

只访问有效数据

当只想访问有效数据时,我们可以使用掩码的逆作为索引。可以使用numpy.logical_not函数或简单使用~运算符计算掩码的逆:

代码语言:javascript
复制
>>> x = ma.array([[1, 2], [3, 4]], mask=[[0, 1], [1, 0]])
>>> x[~x.mask]
masked_array(data = [1 4],
             mask = [False False],
       fill_value = 999999)

另一种检索有效数据的方法是使用compressed方法,该方法返回一维ndarray(或其子类之一,取决于baseclass属性):

代码语言:javascript
复制
>>> x.compressed()
array([1, 4])

修改掩码

通过将True赋给掩码,可以立即屏蔽数组的所有数据:

代码语言:javascript
复制
>>> x = ma.array([1, 2, 3], mask=[0, 0, 1])
>>> x.mask = True
>>> x
masked_array(data = [-- -- --],
             mask = [ True  True  True],
       fill_value = 999999)

最后,可以通过向掩码分配一系列布尔值来对特定数据条目进行掩码和/或取消掩码:

代码语言:javascript
复制
>>> x = ma.array([1, 2, 3])
>>> x.mask = [0, 1, 0]
>>> x
masked_array(data = [1 -- 3],
             mask = [False  True False],
       fill_value = 999999)

取消掩码

要取消屏蔽一个或多个特定数据条目,我们只需为它们分配一个或多个新的有效值:

代码语言:javascript
复制
>>> x = ma.array([1, 2, 3], mask=[0, 0, 1])
>>> x
masked_array(data = [1 2 --],
             mask = [False False  True],
       fill_value = 999999)
>>> x[-1] = 5
>>> x
masked_array(data = [1 2 5],
             mask = [False False False],
       fill_value = 999999)

要取消屏蔽掩码数组的所有掩码条目(假设掩码不是硬掩码),最简单的解决方案是将常量nomask分配给掩码:

代码语言:javascript
复制
>>> x = ma.array([1, 2, 3], mask=[0, 0, 1])
>>> x
masked_array(data = [1 2 --],
             mask = [False False  True],
       fill_value = 999999)
>>> x.mask = ma.nomask
>>> x
masked_array(data = [1 2 3],
             mask = [False False False],
       fill_value = 999999)

索引和切片

由于MaskedArraynumpy.ndarray的子类,它会继承其用于索引和切片的机制。

当访问没有命名字段的被掩蔽数组的单个条目时,输出是标量(如果掩码的相应条目是False)或特殊值masked (如果掩码的相应条目为True):

代码语言:javascript
复制
>>> x = ma.array([1, 2, 3], mask=[0, 0, 1])
>>> x[0]
1
>>> x[-1]
masked_array(data = --,
             mask = True,
       fill_value = 1e+20)
>>> x[-1] is ma.masked
True

如果掩蔽的数组具有命名字段,访问单个条目将返回numpy.void对象(如果没有掩码),或者如果至少一个字段具有与初始数组相同的dtype的0d掩码数组的字段被屏蔽。

代码语言:javascript
复制
>>> y = ma.masked_array([(1,2), (3, 4)],
...                mask=[(0, 0), (0, 1)],
...               dtype=[('a', int), ('b', int)])
>>> y[0]
(1, 2)
>>> y[-1]
masked_array(data = (3, --),
             mask = (False, True),
       fill_value = (999999, 999999),
            dtype = [('a', '<i4'), ('b', '<i4')])

当访问切片时,输出是掩蔽的数组,其data属性是原始数据的视图,并且其掩码是nomask(如果没有无效条目原始数组)或原始掩码的相应切片的副本。需要复制以避免将掩模的任何修改传播到原始版本。

代码语言:javascript
复制
>>> x = ma.array([1, 2, 3, 4, 5], mask=[0, 1, 0, 0, 1])
>>> mx = x[:3]
>>> mx
masked_array(data = [1 -- 3],
             mask = [False  True False],
       fill_value = 999999)
>>> mx[1] = -1
>>> mx
masked_array(data = [1 -1 3],
             mask = [False  True False],
       fill_value = 999999)
>>> x.mask
array([False,  True, False, False,  True], dtype=bool)
>>> x.data
array([ 1, -1,  3,  4,  5])

访问具有结构化数据类型的掩蔽数组的字段会返回MaskedArray

相关推荐:

Numpy 修炼之道 (10)—— 结构化数组

Numpy 修炼之道 (9)—— 广播机制

作者:无邪,个人博客:脑洞大开,专注于机器学习研究。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 脑洞科技栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 访问掩码
  • 只访问有效数据
  • 修改掩码
  • 取消掩码
  • 索引和切片
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档