PyTorch torch.unbind、torch.split 和 torch.chunk函数介绍

ops/2025/2/9 4:21:25/

pytorch torch.unbind、torch.split 和 torch.chunk等函数可用于张量的拆分操作。

1. torch.unbind

功能说明:
torch.unbind 沿指定的维度将张量“解包”为多个张量,返回一个元组。解包后被操作的那个维度会消失,每个输出张量的维度数会比原张量少 1。

函数签名:

torch.unbind(input, dim=0)
  • input: 待解包的张量。
  • dim: 指定沿哪个维度解包。

多维张量示例:

import torch# 创建一个形状为 (2, 3, 4) 的张量
x = torch.arange(24).reshape(2, 3, 4)
print("原始张量 x:\n", x)
print("x.shape:", x.shape)  # torch.Size([2, 3, 4])# 沿第 0 维解包
slices0 = torch.unbind(x, dim=0)
print("\n沿 dim=0 解包:")
for i, t in enumerate(slices0):print(f"slice {i} shape: {t.shape}")# 每个张量形状为 (3, 4)# 沿第 1 维解包
slices1 = torch.unbind(x, dim=1)
print("\n沿 dim=1 解包:")
for i, t in enumerate(slices1):print(f"slice {i} shape: {t.shape}")# 每个张量形状为 (2, 4)

2. torch.split

功能说明:
torch.split 根据给定的大小或尺寸列表,将张量沿指定维度切分成若干块。

  • 如果传入一个整数,则每块的大小为该整数,最后一块可能会小于这个整数。
  • 如果传入一个尺寸列表,则按列表中指定的尺寸进行切分。

函数签名:

torch.split(tensor, split_size_or_sections, dim=0)
  • tensor: 待分割的张量。
  • split_size_or_sections: 整数或尺寸列表,指定每块的大小。
  • dim: 指定沿哪个维度进行切分。

多维张量示例:

import torch# 创建一个形状为 (2, 5, 4) 的张量
x = torch.arange(40).reshape(2, 5, 4)
print("原始张量 x:\n", x)
print("x.shape:", x.shape)  # torch.Size([2, 5, 4])# 按照固定大小进行切分:沿第 1 维,每块大小为 2
splits_fixed = torch.split(x, 2, dim=1)
print("\n沿 dim=1 按固定大小 2 切分:")
for i, t in enumerate(splits_fixed):print(f"chunk {i} shape: {t.shape}")# 输出块的形状可能为 (2, 2, 4), (2, 2, 4) 和最后一块 (2, 1, 4)# 按照指定尺寸列表进行切分:沿第 1 维,分块尺寸为 [1, 2, 2]
splits_list = torch.split(x, [1, 2, 2], dim=1)
print("\n沿 dim=1 按尺寸列表 [1, 2, 2] 切分:")
for i, t in enumerate(splits_list):print(f"chunk {i} shape: {t.shape}")# 分别输出形状 (2, 1, 4), (2, 2, 4), (2, 2, 4)

3. torch.chunk

功能说明:
torch.chunk 将张量沿指定维度平均分成指定数量的块。如果张量在该维度上的长度不能被块数整除,则前面的块会比后面块多一个元素(块的尺寸差别最多为 1)。

函数签名:

torch.chunk(tensor, chunks, dim=0)
  • tensor: 待分割的张量。
  • chunks: 指定分成几块。
  • dim: 指定沿哪个维度进行分块。

多维张量示例:

对比总结

函数分割方式返回结果形式适用场景
torch.unbind沿指定维度将张量完全解包,每个输出不含该维度元组,输出张量数 = 该维度的长度需要逐个处理某一维度上的切片,且希望移除该维度时使用。
torch.split按照指定大小或尺寸列表切分张量元组或列表需要按固定大小或自定义尺寸列表切分张量,最后一块可能不均匀。
torch.chunk将张量均匀分成指定数量的块元组或列表希望将张量平均分成若干块,块数固定,自动处理无法整除的情况。

注意:

  • 当处理多维张量时,选择沿哪一维进行分割非常重要;
  • torch.unbind 会移除分割的那个维度,而 torch.split 和 torch.chunk 则保持原始维度,只是该维度上的大小发生变化。

通过这些示例代码和说明,你可以根据具体需求选择合适的函数来分割多维张量。


http://www.ppmy.cn/ops/156887.html

相关文章

VUE之插槽

1、默认插槽 <template><div class"father"></div><h3>父组件</h3><div class"content"><Category title"热门游戏列表"><ul><li v-for"g in games" :key"g.id">{{…

基于ArcGIS的SWAT模型+CENTURY模型模拟流域生态系统水-碳-氮耦合过程研究

流域是一个相对独立的自然地理单元&#xff0c;它是以水系为纽带&#xff0c;将系统内各自然地理要素连结成一个不可分割的整体。碳和氮是陆地生态系统中最重要的两种化学元素&#xff0c;而在流域系统内&#xff0c;水-碳-氮是相互联动、不可分割的耦合体。随着流域内人类活动…

使用 Docker 部署 RabbitMQ 的详细指南

使用 Docker 部署 RabbitMQ 的详细指南 在现代应用程序开发中&#xff0c;消息队列系统是不可或缺的一部分。RabbitMQ 是一个流行的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。本文将详细介绍如何使用 Docker 部署 RabbitMQ&#xf…

基于微信小程序的校园水电费管理平台设计与实现

目录 摘要 系统展示 技术介绍 MySQL数据库 Vue框架 代码实现 管理员实现登录后端代码 连接数据库 前端代码实现 获取源码 摘要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用…

快速上手——.net封装使用DeekSeek-V3 模型

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,用爱发电,去丈量人心,是否能达到人机合一?开工大吉 新的一年就这么水灵灵的开始了,在这里,祝各位读者新春快乐,万事如意! 新年伊…

vulkan学习(一)

opengl相对与vulkan不是一个级别的东西&#xff0c;opengl几十行代码就可以绘制一个简单的物体&#xff0c;而vulkan需要几百行才能绘制&#xff0c;所以vulkan的学习曲线比较陡峭&#xff0c;本人经过也经过一个很长的时间的断断续续学习对vulkan有了一些认识&#xff0c;在这…

C++中的pair,pair和map的结合

文章目录 1. pair 的基本用法语法&#xff1a;示例&#xff1a; 2. pair 和 map 的结合map 的基本用法语法&#xff1a;示例&#xff1a; 3. pair 和 map 中的具体应用(1) map 中的 pair 存储(2) insert 方法插入 pair(3) 使用 auto 获取 pair 对象(4) 使用 pair 和 map 返回多…

Mac: docker安装以后报错Command not found: docker

文章目录 前言解决办法&#xff08;新的&#xff09;解决步骤&#xff08;原来的&#xff09;不推荐总结 前言 ​本操作参考 http://blog.csdn.net/enhenglhm/article/details/137955756 原作者&#xff0c;更详细请&#xff0c;查看详细内容请关注原作者。 一般&#xff0c;…