You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch C++(LibTorch)如何实现张量多维度切片?

在LibTorch C++中实现Python张量切片操作

两种实现方式

你的Python切片操作是保留第0、3维度的全部元素,对第1、2维度做范围截取,对应LibTorch有两种直观实现方式:

方式1:使用Tensor::slice()方法

slice()的参数为slice(dim, start, end, step),其中step默认是1。对于需要保留全部元素的维度,只需指定start=0、end=tensor.size(dim)即可对应Python的:。实际可以简化为只对需要切片的维度调用slice(),其他维度自动保留:

// 假设h_offset、w_offset、fineSize已定义为整数
auto sliced_tensor = tensor_input
    .slice(1, h_offset, h_offset + fineSize)  // 处理第1维度(高度)
    .slice(2, w_offset, w_offset + fineSize); // 处理第2维度(宽度)

不需要对第0、3维度调用slice(),因为这两个维度的元素会被完整保留。

方式2:使用索引语法(更贴近Python写法)

通过torch::indexing::Slice可以实现和Python完全一致的索引风格,需要先引入命名空间:

#include <torch/torch.h>
using namespace torch::indexing;

auto sliced_tensor = tensor_input.index({
    Slice(),  // 第0维度:对应Python的:
    Slice(h_offset, h_offset + fineSize),  // 第1维度
    Slice(w_offset, w_offset + fineSize),  // 第2维度
    Slice()   // 第3维度:对应Python的:
});

这种写法可读性更强,和Python代码逻辑完全对齐。

切片的内存机制与效率

LibTorch的切片操作(无论是slice()还是index()的Slice)默认创建的是原张量的视图,不会拷贝内存,所有切片后的张量共享原张量的内存空间,因此几乎没有额外的性能开销,效率极高。

需要注意:你通过torch::from_blob创建的张量本身就共享OpenCV cv::Mat的内存,所以切片后的张量依然和原cv::Mat共享内存,必须保证原cv::Mat在切片张量的生命周期内不被销毁,否则会出现悬空指针问题。如果需要独立的内存,可以调用sliced_tensor.clone()主动拷贝数据。

内容的提问来源于stack exchange,提问作者rbaleksandar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:24:56