Pytorch Tensor
https://zhuanlan.zhihu.com/p/64551412
$\qquad$Tensor多维数组底层实现是使用一块连续内存的1维数组,Tensor在元信息里保存了多维数组的形状,在访问元素时,通过多维度索引转化成1维数组相对于数组起始位置的偏移量即可找到对应的数据。
$\qquad$某些Tensor操作(如transpose、permute、narrow、expand)与原Tensor是共享内存中的数据,不会改变底层数组的存储,但原来在语义上相邻、内存里也相邻的元素在执行这样的操作后,在语义上相邻,但在内存不相邻,即不连续了(is not contiguous)。
1 | def window_partition(x, window_size): |
以上述代码为例,在permute后,只是改变了tensor的元信息,现坐标相对于一维数组的变化,上述代码permute后,每个坐标对应的stride会发生改变。stride可以理解为每个下标的权重。
数组 t 在内存中实际以一维数组形式存储,通过 flatten 方法查看 t 的一维展开形式,实际存储形式与一维展开一致。