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]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值