Mask掩码

news/2024/12/13 0:30:40/

Python中Mask的用法

  • 引例
  • Numpy的MaskedArray模块
    • 小于(或小于等于)给定数值
    • 大于(或大于等于)给定数值
    • 在给定范围内
    • 超出给定范围
    • 在算术运算期间忽略NaN和/或infinite值

All men are sculptors, constantly chipping away the unwanted parts of their lives, trying to create their idea of a masterpiece —— Eddie Murphy
所有的人都是雕塑家,不断地消除生活中不必要的部分,试图建立自己的杰作理念 —— 埃迪·墨菲(Eddie Murphy)

引例

import numpy as nparr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

假设要对以上NumPy数组,需要计算小于4和大于6的元素之和。常规方法是采用for循环。

total = 0
for num in arr:if (num<4) or (num>6):total += num
print(total)
>>> 21

使用Mask可以完成相同的功能。首先从手动创建掩模开始:

"""这里True表示满足条件的元素"""
mask = [True, True, True, False, False, False, True, True]
arr[mask].sum()
>>> 21

查看掩码:

arr[mask]
>>> masked_array(data=[1, 2, 3, --, --, --, 7, 8],mask=[False, False, False,  True,  True,  True, False, False],fill_value=999999)

Numpy的MaskedArray模块

Numpy提供了一个名为ma 的内置MaskedArray模块 。 该模块的masked_array()函数可以直接创建一个“ masked array”,在其中将不满足条件的元素呈现/标记为“ invalid” 。
注意 :现在,当mask=False或mask=0 ,字面意思是不要将此值标记为无效。 简而言之,在计算时将其包括在内 。 同样, mask=True或mask=1表示将此值标记为无效。

import numpy.ma as ma"""First create a normal Numpy array"""
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
ma_arr = ma.masked_array(arr, mask=[False, False, False, True,                                     True, True, False, False])
ma_arr
>>>masked_array(data=[1, 2, 3, --, --, --, 7, 8],mask=[False, False, False,  True,  True,  True, False, False],fill_value=999999)

也可以使用列表推导来创建掩码。 但是,由于要交换True和False值,因此可以使用波浪号~来反转布尔值。

arry = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
ma_arry = ma.masked_array(arry, mask=[~((a<4) or (a>6)) for a in arry])
ma_arry
>>>masked_array(data=[1, 2, 3, --, --, --, 7, 8, 9],mask=[False, False, False,  True,  True,  True, False, False,False],fill_value=999999)

根据屏蔽条件的类型,NumPy提供了其他几种内置屏蔽:

小于(或小于等于)给定数值

使用函数masked_less()过滤小于4的数字:

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
ma_arr = ma.masked_less(arr, 4)
ma_arr.sum()
>>>39

要过滤小于等于数字的值,请使用masked_less_equal() 。

大于(或大于等于)给定数值

使用函数masked_less()过滤大于4的数字:

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
ma_arr = ma.masked_greater(arr, 4)
ma_arr.sum()
>>>10

要过滤大于等于数字的值,请使用masked_greater_equal() 。

在给定范围内

函数masked_inside()将过滤两个给定数字(包括两个数字)之间的值。 以下4到6之间的过滤器值。

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
ma_arr = ma.masked_inside(arr, 4, 6)
ma_arr
>>>masked_array(data=[1, 2, 3, --, --, --, 7, 8, 9],mask=[False, False, False,  True,  True,  True, False, False,False],fill_value=999999)

超出给定范围

函数masked_inside()将过滤两个给定数字(包括两个数字)之间的值。 以下4-6之外的过滤器值。

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
ma_arr = ma.masked_outside(arr, 4, 6)
ma_arr
>>>masked_array(data=[--, --, --, 4, 5, 6, --, --, --],mask=[ True,  True,  True, False, False, False,  True,  True,True],fill_value=999999)

在算术运算期间忽略NaN和/或infinite值

实际的数据集通常具有许多缺失值(NaN)或一些奇怪的无穷大值(inf)。 这样的值在计算中产生问题,因此被忽略或推算。
任何值与nan运算,得到的结果都是nan,例如:

a = np.nan
print(a+1)
>>>nana = np.nan
b = np.inf
print(a+b)
>>>nan

可以使用masked_invalid()轻松排除NaN和无限值,该值将从计算中排除这些值。 这些无效值现在将表示为-- 。 此功能对于处理数据科学问题中大型数据集中的丢失数据非常有用 。

arr = np.array([1, 2, 3, np.nan, 5, 6, np.inf, 8, 9])
ma_arr = ma.masked_invalid(arr)
ma_arr
>>>masked_array(data=[1.0, 2.0, 3.0, --, 5.0, 6.0, --, 8.0, 9.0],mask=[False, False, False,  True, False, False,  True, False,False],fill_value=1e+20)
arr.sum()
>>>nan
ma_arr.sum()
>>>34.0

本文参考自binary masks_Python中的Masks概念


http://www.ppmy.cn/news/22717.html

相关文章

QWT--添加Label

文章目录一、前言二、添加画布标签三、游标读数一、前言 在使用QWT绘制曲线的时候&#xff0c;可能需要在画布上标明曲线的信息&#xff0c;例如我最近在做的静态录波&#xff0c;需要标明曲线的物理量&#xff0c;如下所示&#xff1a; 在QWT–数据游标一文中&#xff0c;其实…

【交互式用户流程与演示设计】上海道宁与​Overflow让您能更自信的展示您的设计

Overflow 让设计师和产品经理 能够自信地展示他们的设计 并讲述他们的设计故事 独特的动态和交互式演示 Overflow 的功能 使设计人员能够使用鼠标、键盘和手势 轻松导航用户流程 以闪电般的速度 放大和缩小以在重要时专注于细节 原型模式提供了 新的不同缩放级别和交互…

电力电子技术课程实验:实验一、DC/DC直流斩波电路制作与性能测试

电力电子技术课程实验&#xff1a;实验一、DC/DC直流斩波电路制作与性能测试实验一、DC/DC直流斩波电路制作与性能测试预习报告一、 知识准备二、降压斩波电路MATLAB/Simulink电路三、降压斩波电路MATLAB仿真四、 升压斩波电路MATLAB/Simulink电路五、升压斩波电路MATLAB仿真六…

【RuoYi-Vue-Plus】学习笔记 47 - 翻译功能 Translation 源码分析

文章目录前言参考目录功能代码实现及测试目录结构说明测试类功能调用流程分析1、翻译配置初始化 TranslationConfig#init2、翻译功能的实现2.1、创建自定义上下文序列化器 TranslationHandler#createContextual2.2、设置空值序列化器 TranslationBeanSerializerModifier#change…

C#里使用UdpClient和线程来创建UDP网络通讯

C#里使用UdpClient和线程来创建UDP网络通讯 在开发的过程中,时不时就需要使用到UDP通讯。 比如与仪器进行通讯,获取仪器的数据。 又或者与PLC通讯,而PLC采用UDP的协议,而不是使用TCP协议。 作为一个软件开发人员,所以必须要熟练地使用UDP进行通讯, 才可以随着应用范围的改…

互融云汽车融资租赁系统-汽车金融软件开发

汽车融资租赁作为汽车金融中典型的业务模式&#xff0c;是一种依托现金分期付款的方式&#xff0c;在此基础之上引入出租服务中所有权和使用权分离的特性&#xff0c;租赁结束后将所有权转移给承租人的现代营销方式。即在租赁期内&#xff0c;用户以分期支付租金的方式获得车辆…

开源工具系列3:Prowler

在处理云安全的问题时&#xff0c;一种非常重要的思路就是检测和持续监控云上资源的安全情况&#xff0c;通过专业工具的支持&#xff0c;可以让云安全管理在问题发生前发现云环境中的潜在威胁&#xff0c;进而去采取有效的处理措施。 Prowler 是什么 Prowler 是一个命令行工具…

Docker进阶 - 2. Dockerfile 常用保留字简介

目录 1. FROM 2. MAINTAINER 3. RUN 4. EXPOSE 5. WORKDIR 6. USER 7. ENV 8. VOLUME 9. COPY 10. ADD 11. CMD 12. ENTRYPOINT 13. CMD 和 RUN 命令的区别 本篇文章的讲解截屏示例基于tomcat的Dockerfile&#xff1a;tomcat/9.0/jdk8/openjdk/Dockerfile 1. FR…