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

本文详细解析PyTorch的min函数用法,包括如何指定维度求最小值及索引,保持维度不变的技巧,以及如何通过逆置操作选择左侧最小元素。适合初学者快速掌握min函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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基本数学运算

### PyTorch `torch.histc` 与 `torch.histogram` 的功能及用法 #### 功能对比 `torch.histc` `torch.histogram` 都用于计算输入张量的直方图,但它们的设计目标参数有所不同。 - **`torch.histc`**: 这是一个较早引入的方法,主要用于返回固定范围内的直方图分布。它的核心特点是通过指定最小值 (`min`) 最大值 (`max`) 来定义区间边界,并自动划分成均匀宽度的子区间[^1]。如果某些数据点超出了 `[min, max]` 范围,则这些数据会被忽略不计[^4]。 - **`torch.histogram`**: 它是更灵活的一种方法,在 PyTorch 中作为 NumPy 接口的一部分提供支持。除了可以接受固定的上下限外,还可以传入自定义的 bin 边界数组来创建非均分间隔的直方图[^6]。这意味着用户能够更加精细地控制每个区间的大小以及位置安排。 #### 使用场景分析 当需要快速构建具有预设数量等宽箱子的标准统计图表时可以选择使用 `torch.histc`;而面对复杂需求比如不同长度或者形状各异的数据分区情况则更适合采用 `torch.histogram`. 以下是两个函数的具体差异总结: | 特性 | torch.histc | torch.histogram | |---------------------|--------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------| | 输入类型 | 单一数值型张量 | 支持多种类型的张量 | | Bin 设置 | 基于整数 bins 数目设定 | 可以给定具体的边界的列表 | | 处理越界值 | 自动丢弃超出[min,max]之外的所有样本 | 不会抛弃任何数据项 | | 输出形式 | 返回单一维度的结果向量 | 同样给出频率计数的同时也会附带对应的bin边缘信息 | #### 示例代码展示 下面分别给出了两者的简单应用实例以便直观感受其操作过程: 对于 `torch.histc`, 下面的例子展示了如何利用该命令生成一个简单的频次表: ```python import torch data = torch.tensor([1., 1, 2, 2, 2, 5, 8]) area_intersect = torch.histc(data, bins=5, min=0, max=9) print(area_intersect) # tensor([2., 3., 1., 0., 1.]) ``` 而对于更为通用的 `torch.histogram`, 则可以通过如下方式实现相同目的同时也获取到更多细节: ```python values = torch.tensor([1., 1, 2, 2, 2, 5, 8]) edges = torch.arange(0, 10).float() histogram_values, edges_out = torch.histogram(values, edges) print(histogram_values) # tensor([2., 3., 0., 0., 0., 1., 0., 0., 1.]) print(edges_out) # tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) ``` 上述例子清晰表明了两者之间的主要差别在于后者提供了额外关于箱线的信息即edge values. ### 结论 综上所述,尽管二者都旨在解决相似的问题——绘制直方图并量化离散化后的概率密度估计等问题,但由于各自侧重点有所偏移所以适用场合也存在显著区别。因此在实际项目开发过程中应根据具体业务逻辑合理选用合适的工具从而达到最佳效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值