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

相关推荐
! 冰封雪莲 !1 分钟前
地表水自动监测配套采样设备怎么选?Smart WQS2000 智能采样站介绍
人工智能·环保
zandy10112 分钟前
企业级BI平台选型指南:评估框架与核心能力矩阵
大数据·人工智能·矩阵
远铂3 分钟前
BuildAdmin:GEO优化与AI内容营销一体化解决方案
大数据·人工智能·geo·buildadmin
至乐活着11 分钟前
深入Python内存管理与垃圾回收:从引用计数到分代回收的实战解析
python·性能优化·内存管理·垃圾回收·引用计数
问商十三载13 分钟前
2026大模型GEO站点结构:3个层级逻辑提收录,零成本提32%抓取权重附架构表
人工智能
雪隐29 分钟前
我被 Kimi K3 榨干了 99 块,还笑出了声——一个程序员的“真香”现场
人工智能
sunneo34 分钟前
S18.4AI产品留存与召回——让用户走了还回来(系列收官)
人工智能·产品运营·产品经理·用户运营·用户体验
m0_5474866637 分钟前
《Python数据分析与挖掘》全套PPT课件
python·数据挖掘·数据分析
㱘郳1 小时前
飞机大战Pygame存档
python·pygame
love530love1 小时前
ComfyUI 插件发布 GitHub Release + Comfy Registry (官方节点商店)完整复盘教程(从零开始)
人工智能·windows·github·devops