torch.nonzero详细解析

一、torch.nonzero简介

PyTorch是一个深度学习框架,torch.nonzero是其中一个常用的函数。它可以帮助我们找到一个张量中非零元素的索引。这个函数对于在深度学习任务中,寻找需要的数据的位置或者对数据进行操作非常有用。

我们来看一下它的函数定义:

torch.nonzero(input, out=None) -> Tensor

它的输入是一个张量,输出则是一个2列的张量,其中第i个行代表了input中第i个非零元素的索引。这个经常用来对结果进行处理。如果在输入的张量中没有非零元素,则结果将是一个0行2列的张量。

二、torch.nonzeros与torch.nonzero的不同之处

在深度学习的过程中,我们有时需要使用squeeze()函数将维度为1的维度去掉。不过,由于torch.squeeze()对维度为1的维度无法处理,我们需要使用torch.nonzeros()函数。

和torch.nonzero()函数不同,torch.nonzeros()函数返回的张量是一个元组,在元组中有各个小张量,这些小张量代表了非零元素的位置。

下面是一个使用torch.nonzeros()的例子:

import torch
a = torch.randn(2, 2)
a[1][1] = 0#随机生成一个2x2的矩阵,第二行第二列的元素置为0
print(torch.nonzeros(a))

结果:tensor([0, 1, 1]), tensor([0, 0, 1])

当然,在许多情况下torch.nonzero也是很有用的,只需要在返回结果中使用某些特定的列,并且我们可以使用函数来找到一些特定的元素。

三、使用实例分析:

1. 找到分数最高的学生的索引

假设我们有以下数据,每个学生的成绩包含下列四个元素:姓名,语文分数,数学分数,英语分数。我们可以通过torch.argmax()函数来得到最高分数的学生的索引。

import torch
scores = torch.tensor([
    ["Tom", 85.0, 70.0, 88.0],
    ["Jerry", 68.0, 90.0, 72.0],
    ["Mickey", 92.0, 90.0, 84.0]
])
scores[:, 1:] = scores[:, 1:].float()
indices = torch.argmax(scores[:, 1:].sum(1))#返回沿着指定的轴的所有元素的总和的张量。
print(indices)

运行结果:tensor(2)

我们找到了分数最高的学生,索引为2。

2. 通过索引更改数据

假设我们有一条信息,它的每个元素都是一个数字。我们通过torch.nonzero()函数找到这个数组中的非零元素的位置。并且通过位置把它们的值全部更换为-1。

import torch
data = torch.randn(10, 3, 4)#随机生成一个10x3x4的张量
print(data)
nonzero = torch.nonzero(data)
data[nonzero[:, 0], nonzero[:, 1], nonzero[:, 2]] = -1
print(data)

运行结果:

tensor([[[ 0.6985,  0.6541, -0.6435, -0.8692],
         [-0.7543,  1.9164, -0.1396,  0.1368],
         [-1.3696, -0.8290, -0.6031,  0.7476]],

        [[ 1.1005,  0.4018, -0.5424,  0.2659],
         [-0.2727, -1.4804, -1.9228, -0.4452],
         [-0.9083, -0.8335, -1.1950,  2.8144]],

        [[ 0.4497, -0.1021, -1.3320, -1.3588],
         [-0.1672,  0.2023, -0.3156,  1.2721],
         [ 1.5732,  0.2276, -0.1561,  1.8255]],

        [[-0.7265, -0.0924,  0.4649, -0.5616],
         [-0.7947,  0.4614,  0.6878, -0.4110],
         [ 0.8458, -2.0662, -1.3018,  0.7605]],

        [[ 0.4411, -1.6426,  2.0690, -0.5102],
         [-1.9996,  0.4973, -0.8513, -0.8912],
         [ 0.2831,  0.0574, -0.2876, -0.9645]],

        [[ 0.1698, -1.1984, -0.3162,  1.5354],
         [-0.8763, -1.7511, -2.0049, -0.8586],
         [-1.6701,  0.0138,  0.4732,  0.9307]],

        [[ 0.2027,  0.9982, -1.4201, -0.1439],
         [ 0.8717, -1.1299, -0.9696,  1.0909],
         [-1.8889,  0.0404, -0.4895,  0.6088]],

        [[ 0.3395, -1.1325, -0.0518,  0.8898],
         [-1.4189,  0.2398, -1.8188,  1.2298],
         [-1.4087, -0.0418,  0.0131,  0.8699]],

        [[ 2.6099,  0.9482,  0.1749,  0.7233],
         [-0.8990, -0.3829,  0.4778,  1.8552],
         [ 1.3726, -0.3357, -1.4024, -1.2597]],

        [[ 0.0404,  0.3763,  0.3137, -0.6039],
         [ 0.4763,  0.1439,  0.5738, -0.4584],
         [-0.4458, -1.0648,  1.4215,  1.3238]]])
tensor([[[ 0.6985,  0.6541, -0.6435, -0.8692],
         [-1.0000,  1.9164, -0.1396,  0.1368],
         [-1.0000, -0.8290, -0.6031,  0.7476]],

        [[-1.0000,  0.4018, -0.5424,  0.2659],
         [-0.2727, -1.4804, -1.9228, -0.4452],
         [-0.9083, -0.8335, -1.1950, -1.0000]],

        [[ 0.4497, -0.1021, -1.3320, -1.3588],
         [-0.1672,  0.2023, -0.3156,  1.2721],
         [ 1.5732,  0.2276, -0.1561,  1.8255]],

        [[-0.7265, -0.0924,  0.4649, -0.5616],
         [-0.7947,  0.4614,  0.6878, -0.4110],
         [ 0.8458, -1.0000, -1.3018,  0.7605]],

        [[ 0.4411, -1.6426, -1.0000, -0.5102],
         [-1.9996,  0.4973, -0.8513, -0.8912],
         [ 0.2831,  0.0574, -0.2876, -0.9645]],

        [[ 0.1698, -1.1984, -0.3162,  1.5354],
         [-0.8763, -1.7511, -2.0049, -0.8586],
         [-1.6701,  0.0138,  0.4732,  0.9307]],

        [[ 0.2027,  0.9982, -1.4201, -0.1439],
         [ 0.8717, -1.1299, -0.9696,  1.0909],
         [-1.8889,  0.0404, -0.4895,  0.6088]],

        [[ 0.3395, -1.1325, -0.0518,  0.8898],
         [-1.4189,  0.2398, -1.8188,  1.2298],
         [-1.4087, -1.0000,  0.0131,  0.8699]],

        [[ 2.6099,  0.9482,  0.1749,  0.7233],
         [-0.8990, -0.3829,  0.4778,  1.8552],
         [ 1.3726, -0.3357, -1.4024, -1.2597]],

        [[ 0.0404,  0.3763,  0.3137, -0.6039],
         [ 0.4763,  0.1439,  0.5738, -0.4584],
         [-0.4458, -1.0648,  1.4215,  1.3238]]])

3.寻找张量中最大的值与最小的值

假设我们有一个具有六个元素的张量,其中四个元素是随机整数,两个元素是随机浮点数。我们可以使用torch.max()函数和torch.min()函数来找到张量中的最大值和最小值。

import torch
x = torch.randn(6)#随机生成六个元素的张量
print(x)
max_val, max_ind = torch.max(x, 0)#返回沿着指定的轴的所有元素的最大值,以及对应的索引
min_val, min_ind = torch.min(x, 0)#返回沿着指定的轴的所有元素的最小值,以及对应的索引
print(max_val, max_ind)
print(min_val, min_ind)

运行结果:

tensor([ 1.0147, -0.3900,  0.5612, -1.8045, -0.1226, -0.6230])
tensor(1.0147) tensor(0)
tensor(-1.8045) tensor(3)

四、总结

在本次文章中,我们详细解析了torch.nonzero函数。我们介绍了torch.nonzero和torch.nonzeros两个函数的不同,讲解了它们的使用场景,给出了一些实例。希望读者们能够通过本文认识和掌握torch.nonzero这一函数,更好地应用到深度学习任务中。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/310011.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2025-01-04 19:32
下一篇 2025-01-04 19:32

相关推荐

  • index.html怎么打开 – 详细解析

    一、index.html怎么打开看 1、如果你已经拥有了index.html文件,那么你可以直接使用任何一个现代浏览器打开index.html文件,比如Google Chrome、…

    编程 2025-04-25
  • Resetful API的详细阐述

    一、Resetful API简介 Resetful(REpresentational State Transfer)是一种基于HTTP协议的Web API设计风格,它是一种轻量级的…

    编程 2025-04-25
  • 关键路径的详细阐述

    关键路径是项目管理中非常重要的一个概念,它通常指的是项目中最长的一条路径,它决定了整个项目的完成时间。在这篇文章中,我们将从多个方面对关键路径做详细的阐述。 一、概念 关键路径是指…

    编程 2025-04-25
  • AXI DMA的详细阐述

    一、AXI DMA概述 AXI DMA是指Advanced eXtensible Interface Direct Memory Access,是Xilinx公司提供的基于AMBA…

    编程 2025-04-25
  • neo4j菜鸟教程详细阐述

    一、neo4j介绍 neo4j是一种图形数据库,以实现高效的图操作为设计目标。neo4j使用图形模型来存储数据,数据的表述方式类似于实际世界中的网络。neo4j具有高效的读和写操作…

    编程 2025-04-25
  • c++ explicit的详细阐述

    一、explicit的作用 在C++中,explicit关键字可以在构造函数声明前加上,防止编译器进行自动类型转换,强制要求调用者必须强制类型转换才能调用该函数,避免了将一个参数类…

    编程 2025-04-25
  • HTMLButton属性及其详细阐述

    一、button属性介绍 button属性是HTML5新增的属性,表示指定文本框拥有可供点击的按钮。该属性包括以下几个取值: 按钮文本 提交 重置 其中,type属性表示按钮类型,…

    编程 2025-04-25
  • crontab测试的详细阐述

    一、crontab的概念 1、crontab是什么:crontab是linux操作系统中实现定时任务的程序,它能够定时执行与系统预设时间相符的指定任务。 2、crontab的使用场…

    编程 2025-04-25
  • Vim使用教程详细指南

    一、Vim使用教程 Vim是一个高度可定制的文本编辑器,可以在Linux,Mac和Windows等不同的平台上运行。它具有快速移动,复制,粘贴,查找和替换等强大功能,尤其在面对大型…

    编程 2025-04-25
  • 网站测试工具的详细阐述

    一、测试工具的概述 在软件开发的过程中,测试工具是一个非常重要的环节。测试工具可以快速、有效地检测软件中的缺陷,提高软件的质量和稳定性。与此同时,测试工具还可以提高软件开发的效率,…

    编程 2025-04-25

发表回复

登录后才能评论