Numpy系列(十)- 掩码数组
简介
有时候数据集中存在缺失、异常或者无效的数值,我们可以标记该元素为被屏蔽(无效)状态。
import numpy as np
import numpy.ma as ma
x = np.array([1, 2, 3, -99, 5])
x
Out[289]: array([ 1, 2, 3, -99, 5])
现在可以创造一个掩码数组(标记第四个元素为无效状态)。
mx = ma.masked_array(x, mask=[0, 0, 0, 1, 0])
mx
Out[291]:
masked_array(data=[1, 2, 3, --, 5],
mask=[False, False, False, True, False],
fill_value=999999)
接下来可以计算平均值而不用考虑无效数据。
mx.mean()
Out[292]: 2.75
访问掩码
可通过其mask属性访问掩码数组的掩码。我们必须记住,掩码中的True条目表示无效数据。
mx
Out[293]:
masked_array(data=[1, 2, 3, --, 5],
mask=[False, False, False, True, False],
fill_value=999999)
mx.mask
Out[294]: array([False, False, False, True, False])
只访问有效数据
当只想访问有效数据时,我们可以使用掩码的逆作为索引。可以使用numpy.logical_not函数或简单使用~运算符计算掩码的逆:
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属性):
x.compressed()
Out[297]: array([1, 4])
修改掩码
通过将True赋给掩码,可以立即屏蔽数组的所有数据:
x = ma.array([1, 2, 3], mask=[0, 0, 1])
x.mask = True
x
Out[300]:
masked_array(data=[--, --, --],
mask=[ True, True, True],
fill_value=999999,
dtype=int32)
最后,可以通过向掩码分配一系列布尔值来对特定数据条目进行掩码和/或取消掩码:
x = ma.array([1, 2, 3])
x.mask = [0, 1, 0]
x
Out[303]:
masked_array(data=[1, --, 3],
mask=[False, True, False],
fill_value=999999)
取消掩码
要取消屏蔽一个或多个特定数据条目,我们只需为它们分配一个或多个新的有效值:
x = ma.array([1, 2, 3], mask=[0, 0, 1])
x
Out[305]:
masked_array(data=[1, 2, --],
mask=[False, False, True],
fill_value=999999)
x[-1] = 5
x
Out[307]:
masked_array(data=[1, 2, 5],
mask=[False, False, False],
fill_value=999999)
要取消屏蔽掩码数组的所有掩码条目(假设掩码不是硬掩码),最简单的解决方案是将常量nomask分配给掩码:
x = ma.array([1, 2, 3], mask=[0, 0, 1])
x
Out[309]:
masked_array(data=[1, 2, --],
mask=[False, False, True],
fill_value=999999)
x.mask = ma.nomask
x
Out[311]:
masked_array(data=[1, 2, 3],
mask=[False, False, False],
fill_value=999999)
索引和切片
由于MaskedArray是numpy.ndarray的子类,它会继承其用于索引和切片的机制。
当访问没有命名字段的被掩蔽数组的单个条目时,输出是标量(如果掩码的相应条目是False)或特殊值masked (如果掩码的相应条目为True):
x = ma.array([1, 2, 3], mask=[0, 0, 1])
x
Out[313]:
masked_array(data=[1, 2, --],
mask=[False, False, True],
fill_value=999999)
x[0]
Out[314]: 1
x[-1]
Out[315]: masked
x[-1] is ma.masked
Out[316]: True
如果掩蔽的数组具有命名字段,访问单个条目将返回numpy.void对象(如果没有掩码),或者如果至少一个字段具有与初始数组相同的dtype的0d掩码数组的字段被屏蔽。
y = ma.masked_array([(1,2), (3, 4)],mask=[(0, 0), (0, 1)],dtype=[('a', int), ('b', int)])
y[0]
Out[318]: (1, 2)
y[-1]
Out[319]: (3, --)
当访问切片时,输出是掩蔽的数组,其data属性是原始数据的视图,并且其掩码是nomask(如果没有无效条目原始数组)或原始掩码的相应切片的副本。需要复制以避免将掩模的任何修改传播到原始版本。
x = ma.array([1, 2, 3, 4, 5], mask=[0, 1, 0, 0, 1])
mx = x[:3]
mx
Out[322]:
masked_array(data=[1, --, 3],
mask=[False, True, False],
fill_value=999999)
mx[1] = -1
mx
Out[324]:
masked_array(data=[1, -1, 3],
mask=[False, False, False],
fill_value=999999)
x.mask
Out[325]: array([False, False, False, False, True])
x.data
Out[326]: array([ 1, -1, 3, 4, 5])
访问具有结构化数据类型的掩蔽数组的字段会返回MaskedArray。
Numpy系列(十)- 掩码数组的更多相关文章
- 3.4Python数据处理篇之Numpy系列(四)---ndarray 数组的运算
目录 目录 (一)数组与标量的运算 1.说明: 2.实例: (二)元素级的运算(一元函数) 1.说明: 2.实例: (三)数组级的运算(二元函数) 1.说明: 2.实例: 目录 1.数组与标量的运算 ...
- 3.2Python数据处理篇之Numpy系列(二)--- ndarray数组的创建与变换
目录 (一)ndarray数组的创建 1.从列表以元组中创建: 2.使用函数创建: (二)ndarray数组的变换 1.维度的变换: 2.类型的变换: 目录: 1.ndarray数组的创建 2.nda ...
- Numpy 系列(九)- 结构化数组
简介 之前我们操作Numpy的数组时,都是通过索引来操作的.针对二维数组,使用索引可以完成对行.列的操作.但是这是非常不直观的.可以把二维数组想象成一个excel表格,如果表格没有列名,操作起来会 ...
- python科学计算_numpy_线性代数/掩码数组/内存映射数组
1. 线性代数 numpy对于多维数组的运算在默认情况下并不使用矩阵运算,进行矩阵运算可以通过matrix对象或者矩阵函数来进行: matrix对象由matrix类创建,其四则运算都默认采用矩阵运算, ...
- Alamofire源码解读系列(十二)之请求(Request)
本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...
- java基础解析系列(十)---ArrayList和LinkedList源码及使用分析
java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder jav ...
- Python数据分析 | Numpy与1维数组操作
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/33 本文地址:http://www.showmeai.tech/article-det ...
- 为什么不让用join?《死磕MySQL系列 十六》
大家好,我是咔咔 不期速成,日拱一卒 在平时开发工作中join的使用频率是非常高的,很多SQL优化博文也让把子查询改为join从而提升性能,但部分公司的DBA又不让用,那么使用join到底有什么问题呢 ...
- 为什么不建议给MySQL设置Null值?《死磕MySQL系列 十八》
大家好,我是咔咔 不期速成,日拱一卒 之前ElasticSearch系列文章中提到了如何处理空值,若为Null则会直接报错,因为在ElasticSearch中当字段值为null时.空数组.null值数 ...
随机推荐
- md5sum的使用
通过md5sum可以对文件做哈希校验,用来验证文件完整性. 批量生成校验值 $ find . -iname "*.mp4" -exec md5sum -t {} \; >/t ...
- Vue学习之路2-项目初搭建
1.检查环境是否全部安装成功 2.创建项目 2.1.打开dos命令窗口,使用dos命令转到项目文件夹下: 2.2.输入创建项目命令:vue init webpack myproject1 创建不同的打 ...
- LeetCode算法题-Range Addition II(Java实现)
这是悦乐书的第271次更新,第285篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第138题(顺位题号是598).给定一个m行n列的新二维数组M,其初始值为0.提供一个二 ...
- Hexo自定义页面的方法
原文转自:http://refined-x.com/2017/07/10/Hexo%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A1%B5%E9%9D%A2%E7%9A%84%E6%9 ...
- tcp、udp、ip、icmp报文格式分析
TCP .UDP .IP. ICMP协议报文格式分析 Tcp报文格式: Wireshark抓包如图: 源端口/目的端口(16bit): 在TCP报文中包涵了源端口/目的端口,源端口标识了发送进程,目的 ...
- 英特尔关闭PC计算卡项目—插个卡片就能升级个人电脑
在 2017 年的美国国际消费电子展上,电脑芯片巨头英特尔公司曾经推出一个名为“计算卡”的新产品,相当于把个人电脑的重要零部件整合到了一张信用卡大小的卡片设备中,未来用户升级个人电脑,只需要拔下旧卡片 ...
- Struts2的核心——拦截器
虽然以前已经学了很多的拦截器,但是在这里还是想重头梳理一下所有有关拦截器的知识,尤其是struts2中的拦截器 1:拦截器是什么? java里的拦截器是动态拦截Action调用的对象.它提供了一种机制 ...
- 调参必备---GridSearch网格搜索
什么是Grid Search 网格搜索? Grid Search:一种调参手段:穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果.其原理就像是在数组里找最 ...
- 爬虫基础(四)-----MongoDB的使用
------------------------------------------------------------------------摆脱穷人思维 <四> :减少无意义的频繁决策 ...
- 关于toncat的Invalid character found in the request target.The valid characters are defined in RFC 7230 and RFC3986
首先这个错误通常的产生原因, 是tomcat的确收到了格式不正确的请求参数,根据tomcat的版本支持的解析,tomcat抛出这个错误. 但是还有一种就是前台发送的请求方式由 get发送导致本应pos ...