pytorch tensor索引、切片、连接——Indexing, Slicing, Joining

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/LYKXHTP/article/details/81570564

#PyTorch索引,切片,连接,换位
Indexing, Slicing, Joining, Mutating Ops

##torch.cat
torch.cat(inputs, dimension=0) → Tensor
在给定维度上对输入的张量序列进行连接操作。
torch.cat()可以看做 torch.split() 和 torch.chunk()的反操作。

###参数:

  • inputs (sequence of Tensors) – 可以是任意相同Tensor 类型的python 序列
  • dimension (int, optional) – 沿着此维连接张量序列。

###例子:

x = torch.randn(2, 3)
x

 0.5983 -0.0341  2.4918
 1.5981 -0.5265 -0.8735
[torch.FloatTensor of size 2x3]

torch.cat((x, x, x), 0)

 0.5983 -0.0341  2.4918
 1.5981 -0.5265 -0.8735
 0.5983 -0.0341  2.4918
 1.5981 -0.5265 -0.8735
 0.5983 -0.0341  2.4918
 1.5981 -0.5265 -0.8735
[torch.FloatTensor of size 6x3]

torch.cat((x, x, x), 1)

 0.5983 -0.0341  2.4918  0.5983 -0.0341  2.4918  0.5983 -0.0341  2.4918
 1.5981 -0.5265 -0.8735  1.5981 -0.5265 -0.8735  1.5981 -0.5265 -0.8735
[torch.FloatTensor of size 2x9]

如果dim=0,表示的就是接下来的操作是对于第一维度进行的,也就是行(使行发生变化);如果dim=1,那么它表示接下来的操作是对于第二维度进行的,也就是列(使列发生变化)。

##torch.chunk
torch.chunk(tensor, chunks, dim=0)
在给定维度(轴)上将输入张量进行分块儿。

###参数:

  • tensor (Tensor) – 待分块的输入张量
  • chunks (int) – 分块的个数
  • dim (int) – 沿着此维度进行分块

##torch.gather
torch.gather(input, dim, index, out=None) → Tensor
沿给定轴dim,将输入索引张量index指定位置的值进行聚合。
对一个3维张量,输出可以定义为:

out[i][j][k] = tensor[index[i][j][k]][j][k]  # dim=0
out[i][j][k] = tensor[i][index[i][j][k]][k]  # dim=1
out[i][j][k] = tensor[i][j][index[i][j][k]]  # dim=3

###参数:

  • input (Tensor) – 源张量
  • dim (int) – 索引的轴
  • index (LongTensor) – 聚合元素的下标
  • out (Tensor, optional) – 目标张量

###例子:

>>> t = torch.Tensor([[1,2],[3,4]])
>>> torch.gather(t, 1, torch.LongTensor([[0,0],[1,0]]))
 1  1
 4  3
[torch.FloatTensor of size 2x2]
#解释:
input[[1, 2],      
      [3, 4]]  
index[[0, 0],      
      [1, 0]] 
dim = 1表示在第二维度(列)上操作,
输出的每行取原来Tensor的相应行的index所指列的元素。
例如:
输出的第0行第0列元素取原来Tensor的第0行第0列的值1,
输出的第0行第1列元素也是取原来Tensor的第0行第0列的值1,
输出的第1行第0列元素取原来Tensor的第1行第1列的值4,
输出的第1行第1列元素取原来Tensor的第1行第0列的值3。

 
 
import torch 
a = torch.Tensor([[1,2,3],[4,5,6]])
index_1 = torch.LongTensor([[0,1],[2,0]])
index_2 = torch.LongTensor([[0,1,1],[0,0,0]])
print(torch.gather(a, dim=1, index=index_1))
print(torch.gather(a, dim=0, index=index_2))
输出如下:        
tensor([[1., 2.],
        [6., 4.]])
解释:
input[[1., 2., 3.],
      [4., 5., 6.]]
index [[0,1],
       [2,0]]  
dim = 1表示在第二维度(列)上操作,  
输出的每行取原来Tensor的相应行的index所指列的元素。 
输出的第0行第0列元素取原来Tensor的第0行第0列的值1,
输出的第0行第1列元素也是取原来Tensor的第0行第1列的值2,
输出的第1行第0列元素取原来Tensor的第1行第2列的值6,
输出的第1行第1列元素取原来Tensor的第1行第0列的值4。

tensor([[1., 5., 6.],
        [1., 2., 3.]])
解释:
input[[1., 2., 3.],
      [4., 5., 6.]]
index [[0,1,1],
       [0,0,0]]
dim = 0表示在第一维度(行)上操作,  
输出的每列取原来Tensor的相应列的index所指行的元素。 
    
输出的第0列第0行元素取原来Tensor的第0列第0行的值1,
输出的第0列第1行元素取原来Tensor的第0列第0行的值1,

输出的第1列第0行元素取原来Tensor的第1列第1行的值5,
输出的第1列第1行元素取原来Tensor的第1列第0行的值2,

输出的第2列第0行元素取原来Tensor的第2列第1行的值6,
输出的第2列第1行元素取原来Tensor的第2列第0行的值3。

##torch.index_select
torch.index_select(input, dim, index, out=None) → Tensor
沿着指定维度对输入进行切片,取index中指定的相应项(index为一个LongTensor),然后返回到一个新的张量, 返回的张量与原始张量_Tensor_有相同的维度(在指定轴上)。

注意: 返回的张量不与原始张量共享内存空间。

####参数:

  • input (Tensor) – 输入张量
  • dim (int) – 索引的轴
  • index (LongTensor) – 包含索引下标的一维张量
  • out (Tensor, optional) – 目标张量

####例子:

>>> x = torch.randn(3, 4)
>>> x
1.2045  2.4084  0.4001  1.1372
 0.5596  1.5677  0.6219 -0.7954
 1.3635 -1.2313 -0.5414 -1.8478
[torch.FloatTensor of size 3x4]

indices = torch.LongTensor([0, 2])
torch.index_select(x, 0, indices)

 1.2045  2.4084  0.4001  1.1372
 1.3635 -1.2313 -0.5414 -1.8478
[torch.FloatTensor of size 2x4]

torch.index_select(x, 1, indices)

 1.2045  0.4001
 0.5596  0.6219
 1.3635 -0.5414
[torch.FloatTensor of size 3x2]

##torch.masked_select
torch.masked_select(input, mask, out=None) → Tensor
根据掩码张量mask中的二元值,取输入张量中的指定项( mask为一个 ByteTensor),将取值返回到一个新的1D张量,

张量 mask须跟input张量有相同数量的元素数目,但形状或维度不需要相同。 注意: 返回的张量不与原始张量共享内存空间。

###参数:

  • input (Tensor) – 输入张量
  • mask (ByteTensor) – 掩码张量,包含了二元索引值
  • out (Tensor, optional) – 目标张量

###例子:

>>> x = torch.randn(3, 4)
>>> x

1.2045 2.4084 0.4001 1.1372
0.5596 1.5677 0.6219 -0.7954
1.3635 -1.2313 -0.5414 -1.8478
[torch.FloatTensor of size 3x4]

>>> mask = x.ge(0.5)
>>> mask

1 1 0 1
1 1 1 0
1 0 0 0
[torch.ByteTensor of size 3x4]

>>> torch.masked_select(x, mask)

1.2045
2.4084
1.1372
0.5596
1.5677
0.6219
1.3635
[torch.FloatTensor of size 7]

##torch.nonzero
torch.nonzero(input, out=None) → LongTensor
返回一个包含输入input中非零元素索引的张量。输出张量中的每行包含输入中非零元素的索引。

如果输入input有n维,则输出的索引张量output的形状为 z x n, 这里 z 是输入张量input中所有非零元素的个数。

###参数:

  • input (Tensor) – 源张量
  • out (LongTensor, optional) – 包含索引值的结果张量

###例子:

>>> torch.nonzero(torch.Tensor([1, 1, 1, 0, 1]))

0
1
2
4
[torch.LongTensor of size 4x1]

>>> torch.nonzero(torch.Tensor([[0.6, 0.0, 0.0, 0.0],
… [0.0, 0.4, 0.0, 0.0],
… [0.0, 0.0, 1.2, 0.0],
… [0.0, 0.0, 0.0,-0.4]]))

0 0
1 1
2 2
3 3
[torch.LongTensor of size 4x2]

##torch.split
torch.split(tensor, split_size, dim=0)
将输入张量分割成相等形状的chunks(如果可分)。 如果沿指定维的张量形状大小不能被split_size 整分, 则最后一个分块会小于其它分块。

###参数:

  • tensor (Tensor) – 待分割张量
  • split_size (int) – 单个分块的形状大小
  • dim (int) – 沿着此维进行分割

##torch.squeeze
torch.squeeze(input, dim=None, out=None)
将输入张量形状中的1 去除并返回。 如果输入是形如(A×1×B×1×C×1×D),那么输出形状就为: (A×B×C×D)
当给定dim时,那么挤压操作只在给定维度上。例如,输入形状为: (A×1×B), squeeze(input, 0) 将会保持张量不变,只有用 squeeze(input, 1),形状会变成 (A×B)。

注意: 返回张量与输入张量共享内存,所以改变其中一个的内容会改变另一个。

###参数:

  • input (Tensor) – 输入张量
  • dim (int, optional) – 如果给定,则input只会在给定维度挤压
  • out (Tensor, optional) – 输出张量

###例子:

>>> x = torch.zeros(2,1,2,1,2)
>>> x.size()
(2L, 1L, 2L, 1L, 2L)
>>> y = torch.squeeze(x)
>>> y.size()
(2L, 2L, 2L)
>>> y = torch.squeeze(x, 0)
>>> y.size()
(2L, 1L, 2L, 1L, 2L)
>>> y = torch.squeeze(x, 1)
>>> y.size()
(2L, 2L, 1L, 2L)
>>> y = torch.squeeze(x, 3)
>>> y.size()
(2L, 1L, 2L, 2L)

 
 

##torch.unsqueeze
torch.unsqueeze(input, dim, out=None)
返回一个新的张量,对输入的指定位置插入维度 1

注意: 返回张量与输入张量共享内存,所以改变其中一个的内容会改变另一个。如果dim为负,则将会被转化dim+input.dim()+1

###参数:

  • tensor (Tensor) – 输入张量
  • dim (int) – 插入维度的索引
  • out (Tensor, optional) – 结果张量

###例子:

>>> x = torch.Tensor([1, 2, 3, 4])
>>> torch.unsqueeze(x, 0)
 1  2  3  4
[torch.FloatTensor of size 1x4]
>>> torch.unsqueeze(x, 1)
 1
 2
 3
 4
[torch.FloatTensor of size 4x1]

参考:https://blog.csdn.net/LYKXHTP/article/details/81570564

### 回答1: PyTorchtensor切片是指从一个tensor选择特定的元素或子集。切片操作可以通过索引或范围来指定。下面是关于PyTorch tensor切片的一些重要信息: 1.基本切片操作:您可以使用索引操作符[]来对tensor进行切片。例如,如果有一个3x3的tensor,可以使用`tensor[1:3, 0:2]`来获得第二行和第三行的前两列。 2.索引规则:切片操作的索引是从0开始的。在切片时,起始索引是包含在切片的,而结束索引是不包含在切片的。例如,`tensor[1:3]`将返回索引为1和2的元素,但不包括索引为3的元素。 3.负数索引:您可以使用负数索引来从后面开始对tensor进行切片。例如,`tensor[-1]`将返回最后一个元素。 4.步长操作:您可以使用步长操作来跳过某些元素进行切片。例如,`tensor[0:3:2]`将返回索引为0和2的元素。 5.高维tensor切片:对于高维tensor,您可以在多个维度上进行切片。例如,`tensor[:, 1]`将返回所有行的第二列。 6.更改切片切片的结果是原始tensor的视图,并且共享相同的内存。因此,对切片的更改将反映在原始tensor上。 7.使用切片进行赋值:您可以使用切片操作来对tensor的某些元素进行赋值。例如,`tensor[1:3, 0:2] = 0`将第二行和第三行的前两列设置为0。 请注意,这只是关于PyTorch tensor切片的一些基本信息,更复杂的操作如高级索引和掩码索引等也是可行的。 ### 回答2: PyTorchtensor切片是指从一个tensor选择部分元素的操作。通过切片操作,我们可以访问或修改tensor的特定元素,或者创建一个新的tensor来存储所选元素。 切片操作的基本语法是t[start:stop:step],其start表示起始位置,stop表示结束位置(但不包括该位置上的元素),step表示步长。 例如,如果有一个1维tensor t = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我们可以使用切片操作来选择其的一部分元素。 - t[2:6]将返回一个新的tensor,包含元素2, 3, 4, 5; - t[:5]将返回一个新的tensor,包含元素0, 1, 2, 3, 4; - t[5:]将返回一个新的tensor,包含元素5, 6, 7, 8, 9; - t[1:8:2]将返回一个新的tensor,包含元素1, 3, 5, 7。 对于多维tensor,我们可以使用相同的切片操作来选择各个维度上的元素。 例如,如果有一个2维tensor t = [[0, 1, 2], [3, 4, 5], [6, 7, 8]],我们可以使用切片操作来选择其的一部分元素。 - t[1:3, :2]将返回一个新的tensor,包含元素[[3, 4], [6, 7]],表示选择第1行和第2行的前2列; - t[:, 1]将返回一个新的tensor,包含元素[1, 4, 7],表示选择所有行的第1列。 需要注意的是,切片操作返回的是原始tensor的一个视图,而不是创建一个新的tensor。这意味着对切片后的tensor进行修改,将会影响到原始tensor。如果需要创建一个新的tensor对象,可以使用切片操作的clone()方法来复制原始tensor的数据。 ### 回答3: PyTorch是一个常用的深度学习框架,TensorPyTorch用于处理数据的基本数据结构。在PyTorch,我们可以使用Tensor进行切片操作来选择或修改我们需要的元素。 通过索引操作,我们可以对Tensor进行切片。在切片操作,可以使用逗号分隔的索引列表来选择多个维度的元素。例如,使用tensor[a:b, c:d]的切片操作,可以选择Tensor从第a行到第b行(不包括b)以及第c列到第d列(不包括d)的元素。 在切片操作索引的开始和结束位置都是可选的,如果不指定,则默认为从开头到末尾。此外,还可以使用负数索引来表示从末尾开始的位置。 除了使用切片进行选择之外,我们还可以使用切片进行修改。通过将切片操作放在赋值语句的左侧,我们可以将新的值赋予切片所选择的元素。 值得注意的是,切片操作返回的是原始Tensor的视图,而不是复制。这意味着对切片的修改也会反映在原始Tensor上。 需要注意的是,在PyTorch进行切片操作不会对Tensor进行内存复制,这样可以减少内存消耗并提高代码的执行效率。 总而言之,PyTorchTensor切片操作允许我们根据需要选择或修改Tensor的元素。通过索引切片操作,我们可以根据具体需求灵活操作Tensor的数据。这为我们在深度学习任务提供了丰富的选择和便利性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>