'''
pytorch中,不改变tensor内容本身,而只是重新定义下标的对应关系的操作
另一中解释:这种操作不进行数据拷贝和数据的改变,变的是元数据
元数据:用于描述原始数据的数据,譬如,数据的索引,关系,约束等
改变元数据的操作有:
narrow() pytorch 中的narrow函数起到了筛选一定维度上的数据作用
view()
expand()
tranpose()
'''
##narrow example
'''
narrow(input: Tensor, dim: _int, start: _int, length: _int) -> Tensor: ...
返回输入张量的切片操作结果。 输入tensor和返回的tensor共享内存。
input-需要切片的张量
dim(int)-切片维度
start(int)-开始的索引
length(int)-切片的长度
'''
import torch
x = torch.randn(3,3)
print(x.shape)
print(x)
print(x.narrow(0,2,1))##行切片
print(x.narrow(1,1,2))##列切片
'''
torch.Size([3, 3])
tensor([[-0.8733, -0.7634, 0.6941],
[ 0.1318, 2.1113, -0.9316],
[-1.5169, 0.3649, 0.2992]])
tensor([[-1.5169, 0.3649, 0.2992]])
tensor([[-0.7634, 0.6941],
[ 2.1113, -0.9316],
[ 0.3649, 0.2992]])
'''
'''
view ##改变Tensor形状的函数
'''
x = torch.randn(3,4)
print(x)
print(x.view(2,6))
'''
tensor([[ 1.6286, 0.4354, 1.1284, -0.9401],
[ 0.7829, 0.5280, -0.4748, 0.1003],
[ 0.6278, -0.3183, -0.2721, 1.1991]])
tensor([[ 1.6286, 0.4354, 1.1284, -0.9401, 0.7829, 0.5280],
[-0.4748, 0.1003, 0.6278, -0.3183, -0.2721, 1.1991]])
'''
'''
expand()函数
只能在第0维扩展一个维数,比如原来是是(1,3,4)==》(2,1,3,4),而在其他维度扩展不可以(1,3,4)==》(1,2,3,4)【错误】
如果不增加维数,只是增加维度,要增加的原维度必须是1才可以在该维度增加维度,其他值均不可以
'''
x = torch.randn(4,1) ##必须为1 才能扩展
print(x)
x = x.expand(4,4)
print(x)
'''
tensor([[-1.2685],
[ 0.7738],
[ 0.1152],
[ 0.8798]])
tensor([[-1.2685, -1.2685, -1.2685, -1.2685],
[ 0.7738, 0.7738, 0.7738, 0.7738],
[ 0.1152, 0.1152, 0.1152, 0.1152],
[ 0.8798, 0.8798, 0.8798, 0.8798]])
'''
# 扩展一个新的维度必须在最前面,否则会报错
x = torch.randn(4,1)
print(x)
x = x.expand(2,4,1)
print(x)
'''
tensor([[ 1.4723],
[-1.3273],
[-1.1877],
[ 2.4525]])
tensor([[[ 1.4723],
[-1.3273],
[-1.1877],
[ 2.4525]],
[[ 1.4723],
[-1.3273],
[-1.1877],
[ 2.4525]]])
'''
#某一个维度为-1表示不改变维度大小
x = torch.randn(3,2,2)
print(x)
x = x.expand(2,3,-1,-1)
print(x)
'''
tensor([[[ 0.8054, 0.2731],
[-1.4961, 0.3493]],
[[ 0.3741, 0.3503],
[-1.0371, -0.5290]],
[[-0.8779, -0.2467],
[-0.7054, 0.5037]]])
tensor([[[[ 0.8054, 0.2731],
[-1.4961, 0.3493]],
[[ 0.3741, 0.3503],
[-1.0371, -0.5290]],
[[-0.8779, -0.2467],
[-0.7054, 0.5037]]],
[[[ 0.8054, 0.2731],
[-1.4961, 0.3493]],
[[ 0.3741, 0.3503],
[-1.0371, -0.5290]],
[[-0.8779, -0.2467],
[-0.7054, 0.5037]]]])
'''
x = torch.randn(3, 2)
y = torch.transpose(x, 0, 1)
print("修改前:")
print("x-", x)
print("y-", y)
print("\n修改后:")
y[0, 0] = 11
print("x-", x)
print("y-", y)
'''
修改前:
x- tensor([[ 0.2868, -1.0893],
[ 0.0563, -1.6185],
[ 0.4160, -2.3790]])
y- tensor([[ 0.2868, 0.0563, 0.4160],
[-1.0893, -1.6185, -2.3790]])
修改后:
x- tensor([[11.0000, -1.0893],
[ 0.0563, -1.6185],
[ 0.4160, -2.3790]])
y- tensor([[11.0000, 0.0563, 0.4160],
[-1.0893, -1.6185, -2.3790]])
'''
''':cvar
而在调用contiguous()之后,
PyTorch会开辟一块新的内存空间存放变换之后的数据,
并会真正改变Tensor的内容,按照变换之后的顺序存放数据。
'''
pytorch,改变元数据而使原本数据不变的方法
最新推荐文章于 2023-12-04 11:54:30 发布