简介

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

  1. import numpy as np
  2. import numpy.ma as ma
  3. x = np.array([1, 2, 3, -99, 5])
  4. x
  5. Out[289]: array([ 1, 2, 3, -99, 5])

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

  1. mx = ma.masked_array(x, mask=[0, 0, 0, 1, 0])
  2. mx
  3. Out[291]:
  4. masked_array(data=[1, 2, 3, --, 5],
  5. mask=[False, False, False, True, False],
  6. fill_value=999999)

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

  1. mx.mean()
  2. Out[292]: 2.75

访问掩码

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

  1. mx
  2. Out[293]:
  3. masked_array(data=[1, 2, 3, --, 5],
  4. mask=[False, False, False, True, False],
  5. fill_value=999999)
  6. mx.mask
  7. Out[294]: array([False, False, False, True, False])

只访问有效数据

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

  1. x = ma.array([[1, 2], [3, 4]], mask=[[0, 1], [1, 0]])
  2. x[~x.mask]
  3. masked_array(data = [1 4],
  4. mask = [False False],
  5. fill_value = 999999)

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

  1. x.compressed()
  2. Out[297]: array([1, 4])

修改掩码

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

  1. x = ma.array([1, 2, 3], mask=[0, 0, 1])
  2. x.mask = True
  3. x
  4. Out[300]:
  5. masked_array(data=[--, --, --],
  6. mask=[ True, True, True],
  7. fill_value=999999,
  8. dtype=int32)

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

  1. x = ma.array([1, 2, 3])
  2. x.mask = [0, 1, 0]
  3. x
  4. Out[303]:
  5. masked_array(data=[1, --, 3],
  6. mask=[False, True, False],
  7. fill_value=999999)

取消掩码

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

  1. x = ma.array([1, 2, 3], mask=[0, 0, 1])
  2. x
  3. Out[305]:
  4. masked_array(data=[1, 2, --],
  5. mask=[False, False, True],
  6. fill_value=999999)
  7. x[-1] = 5
  8. x
  9. Out[307]:
  10. masked_array(data=[1, 2, 5],
  11. mask=[False, False, False],
  12. fill_value=999999)

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

  1. x = ma.array([1, 2, 3], mask=[0, 0, 1])
  2. x
  3. Out[309]:
  4. masked_array(data=[1, 2, --],
  5. mask=[False, False, True],
  6. fill_value=999999)
  7. x.mask = ma.nomask
  8. x
  9. Out[311]:
  10. masked_array(data=[1, 2, 3],
  11. mask=[False, False, False],
  12. fill_value=999999)

 索引和切片

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

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

  1. x = ma.array([1, 2, 3], mask=[0, 0, 1])
  2. x
  3. Out[313]:
  4. masked_array(data=[1, 2, --],
  5. mask=[False, False, True],
  6. fill_value=999999)
  7. x[0]
  8. Out[314]: 1
  9. x[-1]
  10. Out[315]: masked
  11. x[-1] is ma.masked
  12. Out[316]: True

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

  1. y = ma.masked_array([(1,2), (3, 4)],mask=[(0, 0), (0, 1)],dtype=[('a', int), ('b', int)])
  2. y[0]
  3. Out[318]: (1, 2)
  4. y[-1]
  5. Out[319]: (3, --)

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

  1. x = ma.array([1, 2, 3, 4, 5], mask=[0, 1, 0, 0, 1])
  2. mx = x[:3]
  3. mx
  4. Out[322]:
  5. masked_array(data=[1, --, 3],
  6. mask=[False, True, False],
  7. fill_value=999999)
  8. mx[1] = -1
  9. mx
  10. Out[324]:
  11. masked_array(data=[1, -1, 3],
  12. mask=[False, False, False],
  13. fill_value=999999)
  14. x.mask
  15. Out[325]: array([False, False, False, False, True])
  16. x.data
  17. Out[326]: array([ 1, -1, 3, 4, 5])

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

Numpy系列(十)- 掩码数组的更多相关文章

  1. 3.4Python数据处理篇之Numpy系列(四)---ndarray 数组的运算

    目录 目录 (一)数组与标量的运算 1.说明: 2.实例: (二)元素级的运算(一元函数) 1.说明: 2.实例: (三)数组级的运算(二元函数) 1.说明: 2.实例: 目录 1.数组与标量的运算 ...

  2. 3.2Python数据处理篇之Numpy系列(二)--- ndarray数组的创建与变换

    目录 (一)ndarray数组的创建 1.从列表以元组中创建: 2.使用函数创建: (二)ndarray数组的变换 1.维度的变换: 2.类型的变换: 目录: 1.ndarray数组的创建 2.nda ...

  3. Numpy 系列(九)- 结构化数组

      简介 之前我们操作Numpy的数组时,都是通过索引来操作的.针对二维数组,使用索引可以完成对行.列的操作.但是这是非常不直观的.可以把二维数组想象成一个excel表格,如果表格没有列名,操作起来会 ...

  4. python科学计算_numpy_线性代数/掩码数组/内存映射数组

    1. 线性代数 numpy对于多维数组的运算在默认情况下并不使用矩阵运算,进行矩阵运算可以通过matrix对象或者矩阵函数来进行: matrix对象由matrix类创建,其四则运算都默认采用矩阵运算, ...

  5. Alamofire源码解读系列(十二)之请求(Request)

    本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...

  6. java基础解析系列(十)---ArrayList和LinkedList源码及使用分析

    java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder jav ...

  7. Python数据分析 | Numpy与1维数组操作

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/33 本文地址:http://www.showmeai.tech/article-det ...

  8. 为什么不让用join?《死磕MySQL系列 十六》

    大家好,我是咔咔 不期速成,日拱一卒 在平时开发工作中join的使用频率是非常高的,很多SQL优化博文也让把子查询改为join从而提升性能,但部分公司的DBA又不让用,那么使用join到底有什么问题呢 ...

  9. 为什么不建议给MySQL设置Null值?《死磕MySQL系列 十八》

    大家好,我是咔咔 不期速成,日拱一卒 之前ElasticSearch系列文章中提到了如何处理空值,若为Null则会直接报错,因为在ElasticSearch中当字段值为null时.空数组.null值数 ...

随机推荐

  1. 我的第一个python web开发框架(24)——系统重构与ORM

    小白弄完代码版本管理和接口文档后,兴奋的找到老菜. 小白:老大,我已经按你讲的要求,将代码版本管理和接口文档都搞好了.从项目开始到现在,除了代码编写,感觉学会好多东西啊. 老菜:嗯嗯,实战确实需要掌握 ...

  2. Python基础——3特性

    特性 切片 L=[0,1,2,3,4,5,6,7,8,9,10] L[:3]=[0,1,2] L[-2:]=[9,10] L[1:3]=[1,2] L[::3]=[0,3,6,9] L[:5:2]=[ ...

  3. SAP CRM 集类型(Set Type)与产品层次(Product Hierarchy)

    本文是产品与对象相关的部分SAP文档的翻译,不包含配置部分. 本文链接:https://www.cnblogs.com/hhelibeb/p/10112723.html 1,对象(Objects) 对 ...

  4. Python开发【前端篇】HTML

    1.html概述和基本结构 html概述 HTML是 HyperText Mark-up Language 的首字母简写,意思是超文本标记语言,超文本指的是超链接,标记指的是标签,是一种用来制作网页的 ...

  5. 微信小程序测试

    1.连接真机,微信已经登录过了 2.代码: 3.appium自带的识别工具 4.设置工具连接设备的方式 参考资料: https://www.cnblogs.com/yoyoketang/p/91449 ...

  6. Vue slot插槽内容分发

    slot插槽使用 使用场景,一般父组件中又一大段模板内容需要运用到子组件上.或者更加复杂的,子组件需要运用到父组件大段模板内容,而子组件却不知道挂载的内容是什么.挂载点的内容是由父组件来决定的. Sl ...

  7. string find()函数

    链接 [https://www.cnblogs.com/wkfvawl/p/9429128.html]

  8. apply和call与this

    函数本身的apply方法,改变this指向哪个对象: function getAge() { var y = new Date().getFullYear(); return y - this.bir ...

  9. 三、调试IIS启动域名配置

    一.IIS配置启动VS以及域名 1.hosts配置 2.配置 注意: 1.Web和Api 端口在IIS都设置80即可,都可以同时运行不冲突,与vs的IIS express启动方式不同vs会指定不同的两 ...

  10. Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)

    Qin Shi Huang's National Road System HDU - 4081 感觉这道题和hdu4756很像... 求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以 ...