数据操作
N维数组是机器学习和神经网络的主要数据结构
创建数组
创建数组需要:(1)形状;(2)每个元素的数据类型;(3)每个元素的值
访问元素
数据操作实实现
入门
#%% 导入torch包
import torch
#%% 具有一个轴的张量称为向量;两个轴称为矩阵;
x = torch.arange(12)
x
#%% 访问张量(沿每个轴的长度)的形状
x.shape
#%% 获取张量中的总数
x.numel()
#%% 改变张量的形状,而不改变元素数量和元素值
X = x.reshape(3,4) #可以用x.reshape(-1,4)或x.reshape(3,-1)代替
X,x
#%% 全0张量
torch.zeros((2,3,4))
#%% 全1张量
torch.ones((2,3,4))
#%% 创建服从N(0,1)的张量
torch.randn(3,4)
#%% 直接为所需张量赋值,最外层的列表对应轴0,内层列表对应轴1
torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]])
运算符
#%% 按元素操作,**代表求幂运算
x = torch.tensor([1.0,2,4,8])
y = torch.tensor([2,2,2,2])
x+y,x-y,x*y,x/y,x**y
#%% 求幂
torch.exp(x)
#%% 连结多个张量
X = torch.arange(12,dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]])
torch.cat((X,Y),dim=0),torch.cat((X,Y),dim=1)
#%% 判断对应位置的值是否相等
X == Y
#%% 对张量中所有元素求和
X.sum()
广播机制
- 通过适当复制元素来扩展⼀个或两个数组,以便在转换之后,两个张量具有相同的形状;
- 对⽣成的数组执⾏按元素操作。
#%% 沿数组中长度为1的轴进行广播
a = torch.arange(3).reshape((3,1))
b = torch.arange(2).reshape((1,2))
a,b,a+b
#%% 索引和切片
X,X[-1],X[1:3]
#%% 通过指定索引来将元素写入矩阵
X[1,2]=9
X
节省内存
#%% 判断Y在进行操作后内存中的位置是否相同
before = id(Y)
Y=Y+X
id(Y)==before
#%% 我们可以使⽤切⽚表⽰法将操作的结果分配给先前分配的数组
Z = torch.zeros_like(Y)
print('id(Z):',id(Z))
Z[:]= X+Y
print('id(Z):',id(Z))
#%% 也可以使⽤X[:] = X + Y或X += Y来减少操作的内存开销
before = id(X)
X +=Y
id(X) == before
转换其他python对象
#%% 张量转换
A = X.numpy()
B = torch.tensor(A)
type(A),type(B)
#%% 将大小为1的张量转换为python标量
a = torch.tensor([3.5])
a,a.item(),float(a),int(a)