Python中数组的索引以及切片
在这里生成数组并且对数组进行切片/通过索引访问,对于使用numpy生成的array或是torch生成的tensor都是适用的
1. 对torch生成的tensor数组进行操作
import torch
import numpy as np
首先,我们可以使用 arange 创建一个行向量 x。这个行向量包含以0开始的前16个整数,它们默认创建为整数。也可指定创建类型为浮点数。张量中的每个值都称为张量的 元素(element)。例如,张量 x 中有 16 个元素。除非额外指定,新的张量将存储在内存中,并采用基于CPU的计算。
#torch.arange():生成不包含最大值的等差数列
x = torch.arange(16)
x
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
可以通过张量的shape属性来访问张量(沿每个轴的长度)的形状 。
x.shape
torch.Size([16])
要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数。 例如,可以把张量x从形状为(16,)的行向量转换为形状为(4,4)的矩阵。 这个新的张量包含与转换前相同的值,但是它被看成一个4行4列的矩阵。 要重点说明一下,虽然张量的形状发生了改变,但其元素值并没有变。 注意,通过改变张量的形状,张量的大小不会改变。
我们可以通过-1来调用此自动计算出维度的功能。 即我们可以用x.reshape(-1,4)或x.reshape(4,-1)来取代x.reshape(4,4)
X = x.reshape(-1,4)
X
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
就像在任何其他Python数组中一样,张量中的元素可以通过索引访问。 与任何Python数组一样:第一个元素的索引是0,最后一个元素索引是-1; 可以指定范围以包含第一个元素和最后一个之前的元素。
如下所示,我们可以用[-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素:(在这里默认是按行进行操作):
X[-1]
tensor([12, 13, 14, 15])
这里的结果与上面的相同:
X[-1,:]
tensor([12, 13, 14, 15])
X[1:3]
tensor([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]
在逗号后面的话就表明是对列进行相应的操作
X[:,-1]
tensor([ 3, 7, 11, 15])
])
X[:,1:3]
tensor([[ 1, 2],
[ 5, 6],
[ 9, 10],
[13, 14]])
注意,X[:-1]表示的是取除了最后一行之外的其他元素
X[:-1]
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
访问指定的元素/行/列
#访问一个元素
X[1,2]
tensor(6)
#访问一行
X[1,:]
tensor([4, 5, 6, 7])
#访问一列
X[:,1]
tensor([ 1, 5, 9, 13])
访问某一个子区域
#访问某一个子区域
#这里要注意[1:3]选择第二个和第三个元素
X[1:3,1:]
tensor([[ 5, 6, 7],
[ 9, 10, 11]])
#跳着访问,从第0行开始每隔3行取一个,从第0列开始每隔2列取一个
X[::3,::2]
tensor([[ 0, 2],
[12, 14]])
除读取外,我们还可以通过指定索引来将元素写入矩阵。
X[1, 2] = 9
X
tensor([[ 0, 1, 2, 3],
[ 4, 5, 9, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
如果我们想为多个元素赋值相同的值,我们只需要索引所有元素,然后为它们赋值。 例如,[0:2, :]访问第1行和第2行,其中“:”代表沿轴1(列)的所有元素。 虽然我们讨论的是矩阵的索引,但这也适用于向量和超过2个维度的张量。
X[0:2, :] = 12
X
tensor([[12, 12, 12, 12],
[12, 12, 12, 12],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
2. 对numpy生成的array数组进行操作
y = np.arange(16)
y
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
Y = y.reshape(4,-1)
Y
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
Y[1,2]
6
Y[1:2]
array([[4, 5, 6, 7]])
Y[::3,::2]
array([[ 0, 2],
[12, 14]])
z = np.array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
z
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
Z = z.reshape(4,4)
Z
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])