【Torch API】pytorch中的torch.where()函数详解

PyTorch torch.where函数详解与实战 这种选择性增强和抑制机制能够突出重要特征,同时弱化噪声特征,从而提高模型对关键信息的敏感度,改善生成质量。 阅读详情
AI摘要

本文详细介绍了torch.where()函数在PyTorch中的两种主要用法。第一种是根据给定的条件选择张量的元素,创建新的张量。当条件为True时,选择x的值,否则选择y的值。第二种特殊用法是当输入为bool型张量时,返回元素同时满足条件的行和列索引。文章通过示例展示了形状相同、不同以及标量情况下的使用,并强调了广播机制的重要性。

前言

本文主要讲述torch.where()的两种用法,第一种是最常规的,也是官方文档所注明的;第二种就是配合bool型张量的计算

1、torch.where()常规用法

我们先看官方文档的解释:

torch.where(condition, x, y)
根据条件,也就是condiction,返回从x或y中选择的元素的张量(这里会创建一个新的张量,新张量的元素就是从x或y中选的,形状要符合x和y的广播条件)。
Parameters解释如下:
1、condition (bool型张量) :当condition为真,返回x的值,否则返回y的值
2、x (张量或标量):当condition=True时选x的值
2、y (张量或标量):当condition=False时选y的值

1.1 形状相同

先演示形状相同的情况:

import torch

x = torch.tensor([[1, 2, 3], [3, 4, 5], [5, 6, 7]])
y = torch.tensor([[5, 6, 7], [7, 8, 9], [9, 10, 11]])
z = torch.where(x > 5, x, y)

print(f'x = {x}')
print(f'=========================')
print(f'y = {y}')
print(f'=========================')
print(f'x > 5 = {x > 5}')
print(f'=========================')
print(f'z = {z}')

>print result:
x = tensor([[1, 2, 3],
        [3, 4, 5],
        [5, 6, 7]])
=========================
y = tensor([[ 5,  6,  7],
        [ 7,  8,  9],
        [ 9, 10, 11]])
=========================
x > 5 = tensor([[False, False, False],
        [False, False, False],
        [False,  True,  True]])
=========================
z = tensor([[5, 6, 7],
        [7, 8, 9],
        [9, 6, 7]])

上面定义了x和y,两者的形状shape=(3, 3)相同,然后condition = x > 5也是就x中的每个元素值都要大于5,这里就能看到x中第0行和第1行都是False,只有第2行的1、2列是True,然后前面说了,为True时使用的是x中的值,为False时使用的是y中的值,那么新创建的z前两行和第2行0列使用的是y中的值,剩下两个使用x中的值,z的shape也是(3, 3)。
 

1.2 标量情况

x = 3
y = torch.tensor([[1, 5, 7]])
z = torch.where(y > 2, y, x)

print(f'y > 2 = {y > 2}')
print(f'=========================')
print(f'z = {z}')

print(f'y > 2 = {y > 2}')
print(f'=========================')
print(f'z = {z}')

>print result:
y > 2 = tensor([[False,  True,  True]])
=========================
z = tensor([[3, 5, 7]])

在这里,x是一个标量,condition = y > 2,你要是问我为什么不把condition设为condition = x > 2,很简单,x > 2不是bool Tensor。这里标量和张量是可以进行广播的!!

example:

a = torch.tensor([1, 5, 7])
b = 3
c = a + b
d = torch.tensor([3, 3, 3])
e = a + d

print(f'c = {c}')
print(f'e = {e}')

>print result:
c = tensor([ 4,  8, 10])
d = tensor([ 4,  8, 10])

其实就是把b = 3拉成了[3, 3, 3],也是就d那样。

1.3 形状不同

其实标量那里也算是形状不同了,这里我再啰嗦一下吧,看例子:

x = torch.tensor([[1, 3, 5]])
y = torch.tensor([[2], [4], [6]])
z = torch.where(x > 2, x, y)

print(f'x = {x}')
print(f'=========================')
print(f'y = {y}')
print(f'=========================')
print(f'x > 2 = {x > 2}')
print(f'=========================')
print(f'z = {z}')

>print result:
x = tensor([[1, 3, 5]])
=========================
y = tensor([[2],
        [4],
        [6]])
=========================
x > 2 = tensor([[False,  True,  True]])
=========================
z = tensor([[2, 3, 5],
        [4, 3, 5],
        [6, 3, 5]])

上面x.shape=(1, 3) y.shape=(3, 1),然后condition = x > 2的shape=(1, 3),是可广播的,所以运算也能成功,在计算torch.where(x > 2, x, y)时,分别对x、y、condition进行广播,x.shape=(3, 3),y.shape=(3, 3),condition.shape=(3, 3)
在这里插入图片描述

 所以y的值替换第0列,第1、2列为x的值。
更多的广播形式请读者朋友自行尝试

2、torch.where()特殊用法

torch.where(a & b)
a和b都是bool Tensor,返回的是一个元组,元组第一项是a、b中都为True的行的index的Tensor,第二项是a、b都为True列的index的Tensor

 请看例子:

a = torch.tensor([[0, 1, 1], [1, 0, 0], [0, 0, 1]], dtype=torch.bool)
b = torch.ones((3, 3), dtype=torch.bool)
c = torch.where(a & b)

print(f'a = {a}')
print(f'=========================')
print(f'b = {b}')
print(f'=========================')
print(f'c = {c}')

>print result:
a = tensor([[False,  True,  True],
        [ True, False, False],
        [False, False,  True]])
=========================
b = tensor([[True, True, True],
        [True, True, True],
        [True, True, True]])
=========================
c = (tensor([0, 0, 1, 2]), tensor([1, 2, 0, 2]))

c就是一个元组,第0项是a、b都为True的行标,第1项是a、b都为True的列标

总结

以上就是torch.where()的两种用法,看起来比较麻烦,多练练也就是那样,特别一点的就是一个广播机制一个特殊用法,欢迎评论指正!

基于torch.where和布尔索引的速度比较 今天小编就为大家分享一篇基于torch.where和布尔索引的速度比较,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 立即下载

相关推荐

5分钟搞定kkFileView 4.4.0 Docker部署:小白也能上手的完整配置流程

本文提供了一份针对kkFileView 4.4.0版本的Docker部署完整指南。通过使用预构建的Docker镜像,即使是新手也能在5分钟内完成文件预览服务的搭建,涵盖从环境准备、镜像拉取、容器启动到服务验证的全流程,并分享了进阶配置与生产环境优化建议。

mango的博客 524

torch.where()用法

本文主要讲述的两种用法,第一种是最常规的,也是官方文档所注明的;第二种就是配合bool型张量的计算以上就是torch.where()的两种用法

euqlll的博客 1万+

Workbench-nCode下发动机引擎应力疲劳分析

在工程数据库中定义材料模型参数,结构场分析基本参数:密度7850Kg/m3、弹性模量210E9Pa、泊松比0.3,疲劳分析参数:应力-疲劳曲线表(S-N Curve),应力-疲劳曲线如下图2所示,如果没有合适的数据可使用结构钢材料进行分析。网格为四面体高阶单元,各零件的单元尺寸如下表1所示,单元质量分布如下图3所示。在workbench平台下搭建分析流程如下图6所示,前述设定完成后,提交求解后即可得到相应的应力、应变结果,更新结果后目录树中会有相应的nCode DesignLife插件,如下图7所示。

ansysxuexizhe的博客 1547

torch.where()函数

是 PyTorch 库中的一个函数,用于根据给定的条件返回输入张量中满足条件的元素的索引。张量中为True的元素索引是0和2,所以返回的索引张量是。中取对应的元素,即1和3;中取对应的元素,即5和7。

weixin_43941438的博客 5066

基于carsim与Simulink联合仿真的车辆换道轨迹规划与轨迹跟踪模型

PID_反步控制_滑膜控制三种四旋翼无人机轨迹跟踪控制算法仿真 附带对应的说明文档,提供建模过程与仿真结果文献(英文)➕PPT 描述:采用的同一种参考轨迹,都是三维仿真 三种控制方法: [1]PID控制、[2]反步控制、[3]滑膜控制(三个仿真模型) 每个仿真均应用了同一种轨迹路径,直接运行即可出三维图,可以实现四旋翼无人机轨迹的跟踪

2501_90804007的博客 1083

电容式麦克风:从原理到实际电路波形解析

本文深入解析电容式麦克风的工作原理,从核心的振膜与背板结构、电荷锁定机制到场效应管放大器的作用。通过实物拆解与等效电路分析,阐明声音振动如何转换为电压信号,并指导如何用示波器实测波形,直观展现声电转换过程,适合电子爱好者和音频技术学习者。

Black的专栏 1079

torch.where()的用法以及例子

1.用法 torch.where()函数的作用是按照一定的规则合并两个tensor类型。 torch.where(condition,a,b)其中 输入参数condition:条件限制,如果满足条件,则选择a,否则选择b作为输出。 注意:a和b是tensor. 2.例子 import torch a = torch.tensor([[0.0349, 0.0670, -0.0612, 0.0280, -0.0222, 0.0422], [-1.6719, 0.1242,

凝眸伏笔的博客 5万+

APM32取代STM32的经验分享

我仔细检查了代码中与硬件相关的部分,例如外设寄存器的访问和中断处理程序的设置,并进行了相应的修改。在本文中,我将分享我将APM32引入项目中取代STM32的经验,并提供相应的源代码。我查看了APM32的官方网站、开发者论坛和相关社交媒体,了解了开发者社区的活跃度和可用的资源。总结起来,将APM32替换STM32的过程需要经过几个关键步骤:了解APM32的规格和功能、评估软件生态系统、迁移代码和调试,以及性能和功耗优化。在开始替换之前,我对APM32进行了详细的研究和评估,以确保它能够满足项目的需求。

UplKubernetes的博客 2004

torch.where()

condition:判断条件,一个布尔类型的张量,表示条件。若当前index满足条件,则取x中index对应的元素若当前index不满足条件,则取y中index对应的元素。

Drug discovery 1094

配置 SAP Web Dispatcher 的实战指南:打通 SAP Fiori、SAP Gateway 与前端系统的关键一跳

SAP Web Dispatcher 在 Fiori 架构中扮演关键角色,作为统一入口处理 HTTPS 请求、实现安全代理和流量分发。它将分散在不同系统的访问路径统一收口,解决浏览器同源策略限制,集中管理 HTTPS 终止和客户端信息传递。典型配置中,Web Dispatcher 监听 443 端口,根据路径将 OData 请求转发至 Gateway 系统,静态资源请求送至前端服务器。SSL 相关配置(如 PSE 文件)确保安全通信,而路由规则(wdisp/system_xx)决定请求转发目标。实施时需注意

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 102

华为OD机试双机位C卷:采购订单 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 采购订单,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,并提供在线OJ模拟做题。华为OD机试真题【采购订单】

qq_45776114的博客 3534

【Python】torch.where()解析

【Python】torch.where()解析

Danger的博客 2461

数控系统(CNC)系列:Hurco VMX42SR_(3).控制系统硬件组成部分

控制箱是CNC系统的核心部分,负责处理所有的控制指令和数据。它通常包含主控板、电源模块、接口板等关键组件。伺服驱动器是CNC系统中的关键组件,负责将主控板发出的控制信号转换为电机所需的驱动电流。它通过闭环控制确保电机的精确运动。电机是CNC系统中的执行机构,负责实现主控板发出的运动指令。常见的电机类型包括步进电机和伺服电机。传感器是CNC系统中的重要组件,用于检测和反馈机床的运行状态。常见的传感器类型包括位置传感器、速度传感器、温度传感器等。电源供应系统为CNC系统的所有组件提供电力。主电源。

2401_87715305的博客 1279

PyTorch torch.cuda.is_available()

PyTorch torch.cuda.is_available()

程永强 582

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

3.Pytorch基础模块torch的API之Indexing,Slicing,Joining,Mutating Ops实例详解

文章目录0. torch1. Tensors2. Creation Ops3. Indexing,Slicing,Joining,Mutating Ops3.1 torch.cat()3.2 torch.chunk()3.3 torch.dstack()3.4 torch.gather()3.5 torch.hstack()3.6 torch.index_select()3.7 torch.masked_select()3.8 torch.movedim()3.9 torch.narrow()3.10 to

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 1025

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

torch.where()函数的三种用法

# torch.where()函数的三种用法: """ 1.torch.where(bool_tensor1 & bool_tensor2)接受两个元素为布尔值(True/False)组成的张量,返回两个张量组成的元组(turple),其中第一个张量中的元素是两布尔张量 bool_tensor1 和 bool_tensor2 均为True的元素的行索引,第二个张量中的元素是两布尔张量bool_tensor1 和 bool_tensor2均为True的元素的列索引。

Alan_sunshine的博客 1155

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Pytorch函数使用记录

文章目录F.conv2d (函数式接口)torch.nonzerotorch.wheretorch.clamptorch.linspacetorch.repeattorch.topk|torch.sort|torch.ne|torch.min|torch.max|torch.lt|torch.le|torch.kthvalue|torch.gt|torch.ge|torch.equal|torch.eq F.conv2d (函数式接口) Pytorch里一般小写的都是函数式的接口,相应的大写的是类式接口,函

John's Blogs 622

PyTorch torch.flatten() 与 NumPy flatten() 对比:3大差异与5个深度学习场景应用

本文深入对比了PyTorch的torch.flatten()与NumPy的flatten()函数在深度学习中的3大核心差异,包括维度控制、内存处理和返回值类型。通过5个典型场景(如CNN过渡、损失函数处理等)的代码示例,帮助开发者根据具体需求选择最佳展平方法,提升模型开发效率。特别适合使用Python进行科学计算和深度学习的开发者参考。

weixin_33692284的博客 351

Pytorch索引、切片、连接

torch.hstack() 是 PyTorch 中的一个函数,用于沿着水平方向(列维度)堆叠张量来创建一个新的张量。torch.column_stack() 是 PyTorch 中的一个函数,用于按列堆叠张量来创建一个新的张量。torch.masked_select() 是 PyTorch 中的一个函数,用于根据给定的掩码从输入张量中选择元素并返回一个新的张量。torch.index_select() 是 PyTorch 中的一个函数,用于按索引从输入张量中选择元素并返回一个新的张量。

qq_44815135的博客 1109

PyTorch torch.Tensor 权威指南:张量创建、索引、自动求导与核心 API 全解析

`torch.Tensor` 是 PyTorch 深度学习框架中最核心的数据结构,是一个保存单一数据类型元素的多维矩阵。本指南以仓库文档 [docs/source/tensors.md](https://link.gitcode.com/i/86d5bae4c8e55f1b2cae9e930e35fc2f) 为主体,结合仓库源码(`torch/_tensor.py`、`torch/_refs/__

gitblog_00928的博客 482

PyTorch ONNX 导出实战:基于 torch.export 的新一代 torch.onnx 导出器完全指南

`torch.onnx` 是 PyTorch 官方提供的模型互操作桥梁:它将原生 `torch.nn.Module` 的计算图捕获并转换为开放神经网络交换格式(ONNX),从而让模型可以在 ONNX Runtime 等大量支持 ONNX 的推理运行时中部署。本文以 [docs/source/onnx.md](https://link.gitcode.com/i/de55dfc2090da380c7

gitblog_00971的博客 259

3、PyTorch张量的运算API(下)

【代码】3、PyTorch张量的运算API(下)

scar2016的博客 364

PyTorch torch.max底层原理与工程避坑指南

torch.max是PyTorch中关键的张量维度聚合算子,其本质并非简单取最大值,而是遵循‘维度压缩+计算图保全’的设计原则,通过返回(values, indices)二元组支持可导、可广播、可复现的极值提取。它在分类预测、通道注意力、序列掩码和硬样本挖掘等场景中承担核心角色,但极易因dim理解偏差、keepdim误设、dtype不匹配或设备混用引发shape错乱、梯度截断、显存溢出等生产级故障。掌握其与torch.topk的分工边界、对nan_policy的支持差异及多维压缩坐标系建模方法,是构建稳定深

weixin_30421809的博客 478

【pytorch学习打卡挑战】day2 Pytorch张量运算API

本专题致力于学习Pytorch及其相关项目。参照B站教程【2、PyTorch张量的运算API(上)】【3、PyTorch张量的运算API(下)】chunk: 按数量均分split: 按大小分割unbind: 完全展开input:输入张量,从中提取数据。dim:指定收集操作的维度。index:索引张量,形状需与input在非dim维度上一致。:是否启用稀疏梯度(默认为Falseout:输出张量(可选)。

qq_40774136的博客 488

PyTorch导出ONNX报错index_put_的根因分析与torch.where改造方案

在深度学习模型部署流程中,将PyTorch模型导出为ONNX格式是跨平台推理的常见环节。然而,模型中的索引赋值操作(如x[mask]=value)会在底层触发PyTorch的index_put_算子,而ONNX导出器对该算子的支持极为有限,常报出“Only consecutive 1-d tensor indices”的运行时错误。理解这一报错的关键在于掌握算子映射原理:PyTorch算子粒度细,ONNX没有与之直接对应的单一算子,导致导出器模式匹配失败。torch.where作为逐元素条件选择算子,语义上

weixin_28223453的博客 259

PyTorch torch 命名空间完全指南:张量运算、加速器、随机采样与序列化全景解析

本文以 PyTorch 官方 API 参考文档 [docs/source/torch.md](https://link.gitcode.com/i/5aff889c4a5aeabb4569fc91376775fe) 为骨架,系统梳理顶层 `torch` 命名空间的核心能力,涵盖张量创建与索引、加速器(CUDA/XPU/MPS 等)体系、随机采样、序列化、并行控制、梯度禁用、各类数学运算、符号数字与

gitblog_00058的博客 685
上一篇: 【Torch API】pytorch中的torch.topk() 函数详解
下一篇: 【Numpy API】np.random.choice函数解析
devil_son1234
博客等级 码龄9年 64粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值