torch.unique
写代码的时候想把一个张量中的最后一个维度进行类似集合那样的操作,于是网上找到了torch.unique
这个方法(官方文档)
torch.unique(input, sorted=True, return_inverse=False, return_counts=False, dim=None) → Tuple[Tensor, Tensor, Tensor]
其中参数sorted
、return_inverse
、return_counts
网上有很多介绍(可以参考这篇),这里不再赘述,本博文主要谈谈对dim
参数的理解
实际上参数dim
就是用来指定划分子张量的维度,unique就是先按指定维度将原张量划分多个子张量,再在这些子张量中剔除重复的子张量
举例子:
X = torch.tensor([[3, 3, 3, 2, 4], [0, 3, 0, 2, 4]]) # dim=0的情况 uni_X = torch.unique(X, dim=0) print(uni_X) # tensor([[0, 3, 0, 2, 4], # [3, 3, 3, 2, 4]]) # dim=1的情况 uni_X = torch.unique(X, dim=1) print(uni_X) # tensor([[2, 3, 3, 4], # [2, 0, 3, 4]])
以上例子,在dim=0情况时,按以下步骤理解:
- 先按第0维(即按行)把原张量划分为2个子张量:
- 由于即没有重复的,所以结果还是由组成
- 别忘了默认参数
sorted=True
,即对和进行字典序升序后再返回,这里按字典序有,所以返回张量(按第0维划分的就按第0维拼回去)
在dim=1情况时,按以下步骤理解:
- 先按第1维(即按列)把原张量划分为5个子张量:
- 可以发现只有即只有这对重复,任意剔除其中一个(这里剔除了),则结果由组成
- 受
sorted=True
影响,对进行字典序升序后再返回,这里按字典序有,所以返回张量(按第1维划分的就按第1维拼回去)
最后,因为unique只能返回张量形式即要求结果对齐,所以要实现开头的需求,只能在指定维度内分别使用unique
即:
X = torch.tensor([[[3, 4, 3, 0], [3, 0, 3, 3], [4, 3, 0, 0]], [[0, 2, 2, 3], [4, 2, 1, 0], [2, 4, 0, 3]]]) uni_X = [[torch.unique(x_ij) for x_ij in x_i] for x_i in X] print(uni_X) # [[tensor([0, 3, 4]), tensor([0, 3]), tensor([0, 3, 4])], # [tensor([0, 2, 3]), tensor([0, 1, 2, 4]), tensor([0, 2, 3, 4])]]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了