PyTorch 張量尺寸為 1 時,步長為何不具語意?

當張量中某個維度的尺寸為 1 時,步長實際上可以是任意值。

我們直接用程式碼來驗證。首先中規中矩地使用 torch.arange 建立一個一維張量 x

python 复制代码
x = torch.arange(10)
x.shape
x.stride()

輸出:

复制代码
torch.Size([10])
(1,)

接著使用 slice 語法,把步長拉大到 100,再取第一個元素:

python 复制代码
y = x[::100][:1]
y
y.shape
y.stride()

輸出:

复制代码
tensor([0])
torch.Size([1])
(100,)

這裡的關鍵是:

  • x[::100] 先把步長變成 100
  • 再取 [:1],把尺寸變成 1
  • 因此最後得到的是尺寸為 1、但步長為 100 的張量

也就是說:只要先用 ::k 拉大步長,再把結果切成單一元素,就能得到尺寸為 1、但步長為 k 的 view。


剛剛的例子是從 x 的第 0 個元素開始取的。我們也可以透過 slice 的 start 參數,讓 view 從別的位置開始:

python 复制代码
y = x[3::100][:1]
y
y.shape
y.stride()

輸出:

复制代码
tensor([3])
torch.Size([1])
(100,)

跟剛剛的例子一樣,尺寸皆為 1,但步長皆為 100。但是張量中唯一一個元素的值變成了 3,而不是原本的 0。

我們可以用 storage_offset 函數來查看張量在底層記憶體中的 offset:

python 复制代码
y.storage_offset()

輸出:

复制代码
3

可以看到,view 張量在底層記憶體中的offset隨著 slice 的起始點改變了。


我們可以把它總結成一般公式:

python 复制代码
x = torch.arange(N)
y = x[offset::k][:1]

以後如果要製造一個「尺寸為 1、但步長和起始位置皆任意」的 view,就可以套用這個公式:

  • offset 控制 storage_offset
  • k 設定步長
  • [:1] 只取第0個元素,使尺寸變為 1

以上程式驗證了本文一開始的說法:當某個維度的尺寸為 1 時,其步長可以是任意值

相关推荐
俊哥V5 分钟前
每日 AI 研究简报 · 2026-08-07
人工智能·ai
调试到凌晨8 分钟前
免费配音工具前置验证价值分析:音色选型、参数调优、克隆测试的零成本方案
人工智能·经验分享·实时音视频
badhope13 分钟前
配了三天Agent开发环境踩了18个坑,我总结了一份零冲突配置指南
人工智能·agent
武子康14 分钟前
Code Mode 什么时候更省:别只数工具调用,要数模型往返
人工智能·llm·agent
HIT_Weston16 分钟前
165、【Agent】【OpenCode】TuiThreadCmd(代理 Fetch 实现)
人工智能·agent·opencode
sunywz22 分钟前
【从零搭建物联网智能充电桩系统】2、自定义二进制协议:设备为什么不用 JSON?
python·物联网·json
小叮当爱咖啡23 分钟前
Day3.参数+Prompt三板斧
开发语言·python·prompt
骄阳如火25 分钟前
论文撰写SKILLS实测三|PaperSpine:每个阶段都是带硬关卡的 gate,审计能直接 BLOCK 你
人工智能
badhope26 分钟前
用RAG做了个智能客服,上线第一天就被用户骂了——我的7天实战复盘
人工智能·langchain
菜冻鱼30 分钟前
Python-pandas-索引与筛选
开发语言·笔记·python·numpy·pandas·学习方法