张量/数组存储方式与向量化展开/展平、view、reshape、permute对比

文章详细介绍了张量的逻辑存储和内存存储,包括C-contiguous和Fortran-contiguous的概念。解释了numpy中的ravel()和flatten()函数在矩阵展平中的应用,以及Pytorch中view(),reshape()和permute()的区别。view()和reshape()主要改变张量的形状描述,而不改变内存,而permute()可能不返回contiguous的张量。此外,文章还展示了如何在Pytorch中实现按列展平的操作。

链接文章:
python pytorch中 .view()函数讲解
pytorch中张量的分块.chunk()方法和拆分.split()方法
NumPy中 ravel() 和 flatten() 展平数组 对比——Dust_Evc
NumPy:确定 ndarray 是查看还是复制以及它是否共享内存
tensor数据存储与内存共享
深入理解Tensor对象_下:从内存看Tensor


1 逻辑存储与内存存储

对于一个Tensor来说,我们可以认为它有两种存储方式

  • 逻辑存储

在这里插入图片描述

  • 内存存储

在这里插入图片描述

1.1 高维张量

  • 在torch/numpy中, 即使是高维张量在内存中也是存储在一块连续的内存区域中
  • 会记录一些元信息来描述数组的"形态", 例如起始地址, 步长 (stride), 大小 (size)等.
  • 对高维张量进行索引时我们采用起始地址 + 地址偏移量的计算方式, 而地址偏移量就需要用到stride和size的信息

在这里插入图片描述

当我们在使用view去修改tensor的时候, 其实我们并没有修改tensor在内存中的存储, 而只是通过修改stride和size来描述张量形状的变化

1.2 按行展开和按列展开

在这里插入图片描述

  • 如果张量x的行优先展开形式和其内存存储一致, 则我们称之为 C-contiguous
    • Numpy, Pytorch中的contiguous指的就是C-contiguous
  • 如果张量x的列优先展开形式和其内存存储一致, 则我们称之为 Fortran-contiguous
    • Matlab, Fortran中的contiguous指的是Fortran-contiguous.
  • 可用转置实现两种存储格式的转换,以pytorch为例:
vp=torch.randn(1,204)
vp1=vp.view(68,-1)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值