N维数组样例
N维数组是机器学习和神经网络的主要数据结构
| 0-d(标量) | 1-d(向量) | 2-d(矩阵) |
| 1.0 | 【1.0,2.7,3.4】 | 【【1.0,2.7,3.4】 【5.0,4.8,0.2】 【4.3,8.5,0.2】】 |
| 一个类别 | 一个特征向量 | 一个样本(特征矩阵) |
| 3-d | 4-d | 5-d |
| 【【【1.0,2.7,3.4】 【5.0,4.8,0.2】 【4.3,8.5,0.2】】 【【1.0,2.7,3.4】 【5.0,4.8,0.2】 【4.3,8.5,0.2】】】 | 【【【【 ..... ..... ..... 】】】】 | 【【【【 ..... ..... ..... 】】】】 |
| RGB图片(宽x高x通道)x乘 | 一个RGB图片批量(批量大小x宽x高x通道) | 一个视频批量(批量大小x时间宽x高x通道) |
创建数组
创建数组需要:
形状:例如3X4矩阵
每个元素的数据类型:例如32位浮点数
每个元素的值,例如全是0,或者随机数
访问元素
一个元素:[1,2]
一行:[1,:]
一列:[:,1]
子区域:[1:3,1:] 从第一行开始到三行开区间结束,从第一列开始拿到所有。
子区域:[::3,::2]双冒号是跳着访问,每三行一跳。每两列一跳。
数据操作
""" 首先,我们应该导入torch。注意,虽然它被称为Pytorch,但我们应该导入torch而不是Pytorch。 """ import torch """ 张量表示一个数值组成的数组,这个数组可能有多个维度 """ x=torch.arange(12) print(x) """ 我们可以通过张量的shape属性来访问张量的形状和张量中元素的总数 """ print(x.shape) print(x.numel())
""" 我们可以通过张量的shape属性来访问张量的形状和张量中元素的总数 """ print(x.shape) print(x.numel()) """ 要改变一个张量的形状而不改变元素数量和元素值,我们可以调用reshape函数 """ x=x.reshape(3,4) print(x) """ 使用全0、全1、其他常量或者从特定分布中随机采样的数字 """ x=torch.zeros((2,3,4)) print(x) x=torch.ones((2,3,4))
""" 通过提供包含数值的python列表(或嵌套列表)来为所需张量中的每个元素赋予确定值 """ x=torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]]) print(x)
""" 常见的标准算术运算符(+、-、*、/、**)都可以被升级为按元素运算 """ x=torch.tensor([1.0,2,4,8]) #1.0表示浮点数 y=torch.tensor([2,2,2,2]) print(x+y) print(x-y) print(x*y) print(x/y) print(x**y)#**运算符是求幂运算
""" 我们也可以把多个张量连接在一起 """ X=torch.arange(12,dtype=torch.float32).reshape((3,4)) #代码的意思是随机生成一个12位的数组,然后改变形状变成3行4列 Y=torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]]) print(torch.cat((X,Y),dim=0) )#dim=0 表示按行合并起来(添加记录) print(torch.cat((X,Y),dim=1) )#dim=1 表示按列合并起来(拼接起来)
""" 通过逻辑运算符构建二元张量 """ X=torch.arange(12,dtype=torch.float32).reshape((3,4)) #代码的意思是随机生成一个12位的数组,然后改变形状变成3行4列 Y=torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]]) print(X==Y) """ 对张量中的所有元素进行求和会产生一个只有一个元素的张量 """ print(X.sum()) """ 即使形状不同,我们仍然可以通过调用广播机制来执行按元素操作 """ a=torch.arange(3).reshape((3,1)) b=torch.arange(2).reshape((1,2)) print(a) print(b) print(a+b)
"""
可以用【-1】选择最后一个元素,可以用【1:3】选择第二个和第三个元素
"""
X=torch.arange(12,dtype=torch.float32).reshape((3,4)) #代码的意思是随机生成一个12位的数组,然后改变形状变成3行4列
print(X[-1])
print(X[1:3])
"""
除读取外,我们还可以通过指定索引来将元素写入矩阵
"""
X=torch.arange(12,dtype=torch.float32).reshape((3,4)) #代码的意思是随机生成一个12位的数组,然后改变形状变成3行4列
print(X)
X[1,2]=9
print(X)
"""
为多个元素赋值相同的值,我们只需要索引所有元素,然后为他们赋值
"""
X=torch.arange(12,dtype=torch.float32).reshape((3,4)) #代码的意思是随机生成一个12位的数组,然后改变形状变成3行4列
print(X)
X[0:2,:]=12 #第0行到第2行的所有元素赋值为12
print(X)
"""
运行一些操作可能会导致为新结果分配内存
"""
before=id(Y) #id表示唯一的标识号
Y=Y+X
print(id(Y)==before)
"""
执行原地操作
"""
Z=torch.zeros_like(Y)
print('id(Z):',id(Z))
Z[:]=X+Y
print('id(Z):',id(Z))
"""
如果在后续计算中没有重复使用X,我们也可以使用X[:]=X+Y或者X+=Y来减少操作的内存开销
"""
before=id(X) #id表示唯一的标识号
X+=Y
print(id(X)==before)
"""
""" 转换为numpy张量 """ A=X.numpy() B=torch.tensor(A) print(type(A)) print(type(B)) """ 将大小为1的张量转换为python标量 """ a=torch.tensor([3.5]) print(a) print(a.item()) print(float(a)) print(int(a))



