百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

对二维张量 `X` 使用布尔索引 `~mask`

ztj100 2024-11-14 19:23 33 浏览 0 评论

为什么 当你对二维张量 `X` 使用布尔索引 `~mask` 时,实际上是将 `X` 中所有满足 `~mask` 为 `True` 的元素提取出来?为什么不提取X中为True的元素?

在理解布尔索引时,我们要明确 mask 和 ~mask 的含义。布尔索引的功能是提取或操作张量中符合某些条件的元素。

为什么是提取满足 ~mask 为 True 的元素?

在下面的代码中,mask 是一个布尔张量,它表示在某些位置上应该保留的元素:

mask = torch.arange((maxlen), dtype=torch.float32,
                    device=X.device)[None, :] < valid_len[:, None]

这里 mask 中为 True 的元素表示这些位置上的元素应该保留,为 False 的元素表示这些位置上的元素应该被遮蔽。

当我们使用 X[~mask] = value 这样的语句时:

X[~mask] = value

意思是将 X 中所有对应 ~mask 为 True 的元素替换为 value。这样做是因为我们想要屏蔽(替换)那些无效的位置。

为什么是 ~mask 而不是 mask?

  • mask 中 mask 中`对True 表示有效的位置,这些位置的值应该保留。
  • mask 中 False 表示无效的位置,这些位置的值应该屏蔽。

我们需要将无效位置的值替换为 value,因此使用 ~mask(对 mask 取反)来索引那些无效的位置。

举例说明

假设 X 是:

[[1, 2, 3],
 [4, 5, 6]]

valid_len 是:

[1, 2]

生成 mask 的过程如下:

maxlen = X.size(1)  # 3
mask = torch.arange((maxlen), dtype=torch.float32, device=X.device)[None, :] < valid_len[:, None]

生成的 mask 是:

[[ True, False, False],
 [ True,  True, False]]

对于 X,我们希望将 mask 中 False 对应的位置替换为 value,所以我们用 ~mask:

~mask = [[False,  True,  True],
         [False, False,  True]]

这样,我们就可以将 X 中这些位置的值替换为 value:

X[~mask] = value

这时的 X 变为:

[[1, 0, 0],
 [4, 5, 0]]

总结

在Python中,特别是使用NumPy或Pandas这类库处理数组和数据帧时,布尔索引是一种强大的特性,它允许你根据条件选择数组或数据帧的一部分。这里的操作符 `~` 是按位取反运算符,它会反转布尔数组中的真值(True和False)。所以当你有一个布尔掩码(例如,`mask`)并且你执行 `~mask`,原本为 `True` 的位置将会变为 `False`,而为 `False` 的位置会变为 `True`。

当我们用这样的反转掩码 `~mask` 去索引另一个数组 `X` 时,我们实际上是在告诉Python:“请从 `X` 中选择那些在 `~mask` 中为 `True` 的对应位置的元素。” 因为 `~mask` 转换后指示的是原 `mask` 中 `False` 的位置,所以这样做实际上是选择了 `X` 中原本不满足 `mask` 条件的元素,而非满足条件的元素。

举个例子,假设你有一个数组 `X = [10, 20, 30, 40]` 和一个布尔掩码 `mask = [True, False, True, False]`,`mask` 表明你想要排除(或说是不感兴趣于)`X` 中的前一个和第三个元素(因为它们在 `mask` 中对应的位置是 `True`,意味着这些位置上的值满足某个条件)。如果你使用 `~mask`,得到 `[False, True, False, True]`,这实际上标记出了你想保留的元素位置。因此,当你用 `X[~mask]` 索引时,你得到的是 `[20, 40]`,即 `X` 中那些原本在 `mask` 中为 `False` 的值。

简而言之,使用 `~mask` 实现的是逻辑上的“取反”,帮助你从原始数据集中选出那些不满足原始条件的元素,而不是直接选取满足条件的元素。

相关推荐

sharding-jdbc实现`分库分表`与`读写分离`

一、前言本文将基于以下环境整合...

三分钟了解mysql中主键、外键、非空、唯一、默认约束是什么

在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。...

MySQL8行级锁_mysql如何加行级锁

MySQL8行级锁版本:8.0.34基本概念...

mysql使用小技巧_mysql使用入门

1、MySQL中有许多很实用的函数,好好利用它们可以省去很多时间:group_concat()将取到的值用逗号连接,可以这么用:selectgroup_concat(distinctid)fr...

MySQL/MariaDB中如何支持全部的Unicode?

永远不要在MySQL中使用utf8,并且始终使用utf8mb4。utf8mb4介绍MySQL/MariaDB中,utf8字符集并不是对Unicode的真正实现,即不是真正的UTF-8编码,因...

聊聊 MySQL Server 可执行注释,你懂了吗?

前言MySQLServer当前支持如下3种注释风格:...

MySQL系列-源码编译安装(v5.7.34)

一、系统环境要求...

MySQL的锁就锁住我啦!与腾讯大佬的技术交谈,是我小看它了

对酒当歌,人生几何!朝朝暮暮,唯有己脱。苦苦寻觅找工作之间,殊不知今日之事乃我心之痛,难道是我不配拥有工作嘛。自面试后他所谓的等待都过去一段时日,可惜在下京东上的小金库都要见低啦。每每想到不由心中一...

MySQL字符问题_mysql中字符串的位置

中文写入乱码问题:我输入的中文编码是urf8的,建的库是urf8的,但是插入mysql总是乱码,一堆"???????????????????????"我用的是ibatis,终于找到原因了,我是这么解决...

深圳尚学堂:mysql基本sql语句大全(三)

数据开发-经典1.按姓氏笔画排序:Select*FromTableNameOrderByCustomerNameCollateChinese_PRC_Stroke_ci_as//从少...

MySQL进行行级锁的?一会next-key锁,一会间隙锁,一会记录锁?

大家好,是不是很多人都对MySQL加行级锁的规则搞的迷迷糊糊,一会是next-key锁,一会是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加...

一文讲清怎么利用Python Django实现Excel数据表的导入导出功能

摘要:Python作为一门简单易学且功能强大的编程语言,广受程序员、数据分析师和AI工程师的青睐。本文系统讲解了如何使用Python的Django框架结合openpyxl库实现Excel...

用DataX实现两个MySQL实例间的数据同步

DataXDataX使用Java实现。如果可以实现数据库实例之间准实时的...

MySQL数据库知识_mysql数据库基础知识

MySQL是一种关系型数据库管理系统;那废话不多说,直接上自己以前学习整理文档:查看数据库命令:(1).查看存储过程状态:showprocedurestatus;(2).显示系统变量:show...

如何为MySQL中的JSON字段设置索引

背景MySQL在2015年中发布的5.7.8版本中首次引入了JSON数据类型。自此,它成了一种逃离严格列定义的方式,可以存储各种形状和大小的JSON文档,例如审计日志、配置信息、第三方数据包、用户自定...

取消回复欢迎 发表评论: