pytorch实现某一维度的数据扩充(repeat、reshape、resize、cat等的用法和区别)

场景:想要将一个维度为(a,5,c)的张量扩充至(a,22,c),要求扩充后的张量axis=1的前5行是原张量,剩余行是扩充的数字。即只扩充指定维的数据,没有搜到现成的做法,自己进行了以下尝试:

1、使用repeat()想将b变成和a同size的张量

import torch
a = torch.ones(2, 22, 3)
b = torch.zeros(2, 5, 3)
b1 = b.repeat(1, 22, 1)      
print(b1.size())  # (2,110,3)
# repeat是将指定维重复n次,n必须是整型int

事实证明repeat将指定维重复n次,且n必须是整型int,没办法满足我将axis=1的维从5变到12的想法

2、使用reshape()

import torch
a = torch.ones(2, 22, 3)
b = torch.zeros(2, 5, 3)
b1 = b.reshape(2, 22, 3)      #报错

报错,根据报错信息得知,reshape是将张量中的元素重新排列成要求的shape

比如原张量x(a,b,c),reshape之后的张量y(a1,b1,c1),要求a1*b1*c1=a*b*c,即必须满足原来的tensor和reshape的tensor元素个数相等,不能达到我的目的

3、使用resize_()

import torch
a = torch.ones(2, 22, 3)
b = torch.zeros(2, 5, 3)
b1 = b.resize_(2, 22, 3)      
print(b1.size())  # (2,22,3)

可以使用该方法扩充某一维的数据,但是我输出扩充后的数据如下,发现使用resize_()扩充某一维的数据,会将改维已有数据排在前面,剩余的坑用自带的插值计算出的数来占领,也就是将第1维原来的数据都挤到前面来了。但是我想要第1维的原有数据保持位置不变,其他多出来的坑位用0补齐。

x = torch.ones(2, 4, 2)
Y = torch.zeros(2, 2, 2)
y3=Y.resize_(2,4,2)
print(y3.size())  # (2,4,2)
print(y3)

4、最后用了最笨的cat方法,创建一个辅助的全o张量来与需要扩充的张量进行拼接,验证可得到想要的答案。

x = torch.ones(2, 4, 2)
Y = torch.ones(2, 2, 2)
y3= torch.zeros(2, 2, 2)
y4 = cat((Y,y3),1)  # 在第一维上进行cat拼接
print(y4.size())  # (2,4,2)
print(y4)

PyTorch中,可以使用索引和切片操作来删除张量中的某个维度上的数据。下面是删除张量第一维度的数据的示例代码: ```python import torch # 创建一个3维的张量 x = torch.tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) print("原始张量:") print(x) # 使用索引和切片操作删除第一维度的数据 new_x = x[:, 1:, :] print("删除第一维度的数据后的张量:") print(new_x) ``` 上述代码中,我们首先创建了一个3维的张量`x`,然后使用索引和切片操作`[:, 1:, :]`删除了第一维度的数据。输出结果显示了删除数据后的张量。索引和切片操作中的冒号(:)表示选取整个维度,而数字1表示从第二个元素开始选取。因此,`[:, 1:, :]`表示选取第二个元素及之后的所有元素。 注意,删除数据时并不会在原地操作,而是创建一个新的张量。如果你希望在原地操作,可以使用`torch.Tensor`的`index_copy_`方法,如下所示: ```python x = torch.tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) print("原始张量:") print(x) # 在原地删除第一维度的数据 x.index_copy_(1, torch.tensor([0]), torch.tensor([[0, 0, 0], [0, 0, 0]])) print("在原地删除第一维度的数据后的张量:") print(x) ``` 上述代码中,我们使用`index_copy_`方法将第一维度的数据替换为全零的张量,实现了在原地删除第一维度的数据。输出结果显示了删除数据后的张量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值