PyTorch中基于列优先重塑一维数组的高效实现方法
PyTorch实现列优先重塑的高效方法
你的问题核心是:torch.reshape默认按**行优先(C顺序)填充元素,导致输出不符合预期;你需要的是列优先(Fortran顺序)**排列的矩阵,同时希望避免不必要的数据复制以保证效率。
以下是两种最优解决方案:
方法1:用torch.as_strided创建视图(无数据复制,效率最高)
直接基于原张量的内存布局构造目标形状的视图,完全不复制数据:
import torch p = torch.arange(0, 12, requires_grad=False, dtype=torch.int32) # size指定目标形状为4行3列,stride设置步长:行内步长1,列间步长4 pr = torch.as_strided(p, size=(4, 3), stride=(1, 4))
原理:通过stride=(1,4)指定,访问第i行第j列元素时,实际取原张量中索引为i*1 + j*4的元素,正好匹配你期望的排列顺序。
方法2:用reshape配合order='F'(代码简洁,会生成副本)
如果对性能要求没有那么极致,这种方式代码更直观:
pr = p.reshape(4, 3, order='F')
原理:order='F'强制按列优先填充元素,最终输出就是你想要的矩阵。但由于原张量是C顺序连续存储,该操作会生成数据副本,效率略低于as_strided。
注意事项
torch.as_strided需要手动控制步长,使用时要确保步长设置正确,避免内存越界;- 若后续无需修改原张量,
as_strided是最优选择;若需要对新张量进行连续内存操作,reshape+order='F'生成的副本可能更方便。
内容的提问来源于stack exchange,提问作者Miraboreasu
相关产品推荐
相关产品推荐

