pytorch,改变元数据而使原本数据不变的方法

'''
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的内容,按照变换之后的顺序存放数据。


'''

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值