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/zh-hk/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

發表回復

登錄後才能評論