一、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