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

相关推荐
m0_678485452 小时前
怎么导入只包含特定表的SQL文件_正则提取与分离导入
jvm·数据库·python
小t说说2 小时前
2026年PPT生成工具评测及使用体验
大数据·前端·人工智能
NineData2 小时前
NineData 将亮相 2026 德国汉诺威工业博览会
数据库·人工智能·数据库管理工具·ninedata·数据库迁移工具·玖章算术
AI人工智能+2 小时前
文档抽取系统结合OCR技术与大语言模型,有效解决档案数字化与知识化利用之间的矛盾
人工智能·计算机视觉·ocr·文档抽取
qq_432703662 小时前
MySQL中如何编写带有循环的函数_MySQL函数流程控制技巧
jvm·数据库·python
LiAo_1996_Y2 小时前
如何保证MongoDB文档的数据质量_JSON Schema验证规则配置
jvm·数据库·python
原我归来是少年2 小时前
四 InsightMemory - 从相似召回到证据链召回:让 AI 的记忆可审计
人工智能
Yu_Lijing2 小时前
Python数据分析和数据处理库Pandas(DataFrame数据分析入门)
人工智能·python·数据分析·pandas
思绪无限2 小时前
YOLOv5至YOLOv12升级:日常场景下的人脸检测系统的设计与实现(完整代码+界面+数据集项目)
深度学习·yolo·目标检测·日常场景下的人脸检测·yolov12·yolo全家桶