三阶张量的torch.min()和torch.max()

 

torch.min(input, dim, keepdim=False, out=None) -> (Tensor, LongTensor)

返回新的张量,其中包括输入张量input中指定维度dim中每行的最小值,同时返回每个最小值的位置索引。

若keepdim值为True,则在输出张量中,除了被操作的dim维度值降为1,其它维度与输入张量input相同。否则,dim维度相当于被执行torch.squeeze()维度压缩操作,导致此维度消失,最终输出张量会比输入张量少一个维度。

参数:

  • input (Tensor) - 输入Tensor
  • dim (int) - 指定维度
  • keepdim (bool) - 输出张量是否保持与输入张量有相同数量的维度
  • out (tuple,optional) - 结果张量
import torch
import numpy as np
a = [[[2,2,4,5],[1,4,3,8],[7,9,5,8]],
     [[3,4,5,6],[3,5,3,6],[5,7,9,10]],
     [[3,4,1,5],[5,7,4,5],[6,6,6,4]]]
a=np.array(a)   # list -> numpy
a=torch.from_numpy(a)  # numpy -> tensor
print("a:{}".format(a))
print("a.size:{}".format(a.size()))
b = torch.min(a,1)
c = torch.min(a,1,keepdim=True)
d = torch.min(a,0)
e = torch.min(a,2)
print("torch.min(a,1):{}".format(b))
print("b.values.size:{}".format(b[0].size()))
print("c.values.size:{}".format(c[0].size())) 
print("torch.min(a,0):{}".format(d))
print("torch.min(a,2):{}".format(e))

运行结果:

a:tensor([[[ 2,  2,  4,  5],
         [ 1,  4,  3,  8],
         [ 7,  9,  5,  8]],

        [[ 3,  4,  5,  6],
         [ 3,  5,  3,  6],
         [ 5,  7,  9, 10]],

        [[ 3,  4,  1,  5],
         [ 5,  7,  4,  5],
         [ 6,  6,  6,  4]]])
a.size:torch.Size([3, 3, 4])
torch.min(a,1):torch.return_types.min(
values=tensor([[1, 2, 3, 5],
        [3, 4, 3, 6],
        [3, 4, 1, 4]]),
indices=tensor([[1, 0, 1, 0],
        [1, 0, 1, 1],
        [0, 0, 0, 2]]))
b.values.size:torch.Size([3, 4])
c.values.size:torch.Size([3, 1, 4])
torch.min(a,0):torch.return_types.min(
values=tensor([[2, 2, 1, 5],
        [1, 4, 3, 5],
        [5, 6, 5, 4]]),
indices=tensor([[0, 0, 2, 2],
        [0, 0, 1, 2],
        [1, 2, 0, 2]]))
torch.min(a,2):torch.return_types.min(
values=tensor([[2, 1, 5],
        [3, 3, 5],
        [1, 4, 4]]),
indices=tensor([[1, 0, 2],
        [0, 2, 0],
        [2, 2, 3]]))

运行截图:

可以在最后torch.min(a,2)结果中看到选最小值的时候不是从左往右的,a中第一个框里两个2,都是最小的,分别在0和1的位置。而indices中相应位置是1,选的是右方的2。由于我目前所做的东西,是需要选最左边的最小的,所以在此之前先对a的第三阶进行逆置一下。

更改代码如下:

import torch
import numpy as np
a = [[[2,2,4,5],[1,4,3,8],[7,9,5,8]],
     [[3,4,5,6],[3,5,3,6],[5,7,9,10]],
     [[3,4,1,5],[5,7,4,5],[6,6,6,4]]]
aa = [[[0 for _ in range(4)] for _ in range(3)] for _ in range(3)]
for w in range(3):
  for z in range(3):
    aa[w][z] = list(reversed(a[w][z])) # reversed返回的是一个iterator(迭代器),所以需要再list一下重新转换为列表
aa=np.array(aa)   # list -> numpy
aa=torch.from_numpy(aa)  # numpy -> tensor
e = torch.min(aa,2)
print("aa:{}".format(aa))
print("torch.min(aa,2):{}".format(e))
print("torch.min(a,2)选最左的最小值:{},\n{}".format(e[0],torch.sub(3, e[1])))

运行结果:

aa:tensor([[[ 5,  4,  2,  2],
         [ 8,  3,  4,  1],
         [ 8,  5,  9,  7]],

        [[ 6,  5,  4,  3],
         [ 6,  3,  5,  3],
         [10,  9,  7,  5]],

        [[ 5,  1,  4,  3],
         [ 5,  4,  7,  5],
         [ 4,  6,  6,  6]]])
torch.min(aa,2):torch.return_types.min(
values=tensor([[2, 1, 5],
        [3, 3, 5],
        [1, 4, 4]]),
indices=tensor([[3, 3, 1],
        [3, 3, 3],
        [1, 1, 0]]))
torch.min(a,2)选最左的最小值:tensor([[2, 1, 5],
        [3, 3, 5],
        [1, 4, 4]]),
tensor([[0, 0, 2],    # 由1变为了0
        [0, 0, 0],    # 由2变为了0
        [2, 2, 3]])

可以看到最后的结果由原来的1变为了0,选的最小值变为从左往右的了。在这里我重新定义了个aa,没有改变原来的列表a。

运行截图:

torch.max()同理。

参考资料:[Pytorch]Pytorch中tensor常用语法

                  torch中关于torch.max()和torch.min()函数的理解

                  python reverse反转部分数组

                  Pytorch Tensor基本数学运算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值