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 時,其步長可以是任意值

相关推荐
火山引擎开发者社区6 小时前
火山AgentPlan/CodingPlan同步上线GLM-5.2
人工智能
冬奇Lab7 小时前
Skill 系列(05):Skill 工作流串联——4 种模式实测,并发加速 1.5x
人工智能·开源
冬奇Lab7 小时前
每日一个开源项目(第141篇):hiring-agent - HackerRank 开源了他们的简历评分系统,你的简历能得几分?
人工智能·面试·开源
甲维斯7 小时前
又升级咯!坦克大战2026,科技与复古并存!
前端·人工智能·游戏开发
姗姗来迟了9 小时前
用React Hook封装AI对话状态
人工智能
Goodbye9 小时前
从 Token 到 Embedding:LLM 核心基础深度解析
javascript·人工智能
阿瑞IT10 小时前
AI Agent 在甘特计划变更场景中的动态响应工程实践
人工智能
用户9385156350710 小时前
工具调用背后:LLM 如何突破“缸中大脑”,操控真实世界?
javascript·人工智能