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常用语法