N维数组
0d标量
1d向量[1.0,2.7,3.4]
2d矩阵
[[1.0,2.7,3.4]
[1.0,2.7,3.4]
[1.0,2.7,3.4]]
3dRGB图片
4d一个RGB图片批量
5d视频
创建数组
创建数组需要:
形状、数据类型、每个元素的值
访问元素
一个元素[1,2]
一行[1,:]
一列[:,1]
子域[1:3,1:]左闭右开
子区域[::3,::2]
张量表示一个由数值组成的数组,这个数组可能有多个维度
x=torch.arange(12)#生成一个张量x [0,1,2...11]
可以指定数据类型如x.torch.arrange(12,dtype=torch.float32)
x.shape#返回一个数组
x.numel()#number of element元素个数,标量
X=x.reshape(3,4)#改变张量的形状而不改变元素数量和元素值,生成3*4的矩阵
torch.zeros
torch.ones
标准的算术运算+-*/和**指数(都是按元素+-*/**)
把多个张量连结在一起:
torch.cat((X, Y), dim=0)#按行连结
torch.cat((X, Y), dim=1)#按列连结
X==Y#通过逻辑运算符构建张量
X.sum()#对张量所有元素求和
广播机制
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b
(tensor([[0],
[1],
[2]]),
tensor([[0, 1]]))
a + b
tensor([[0, 1],
[1, 2],
[2, 3]])
以上a复制了两列,b复制了3行
X[-1]
X[1:3]
X[1,2]=9
X[0:2,:]=12
运行一些操作可能会导致为新结果分配内存
before = id(Y)
Y = Y + X#本质上是产生了一个新的Y(在Python中)
id(Y) == before
False
原地操作
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y#本质上是对Z进行改写(这里与C++理解相同)
print('id(Z):', id(Z))
id(Z): 140182725157808
id(Z): 140182725157808
before = id(X)
X += Y#这个是原地操作
id(X) == before
True
转换为其他Python对象
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)
(numpy.ndarray, torch.Tensor)#X为torch数据类型,A为numpy,B为torch
将大小为1的张量转换为Python标量
a = torch.tensor([3.5])
a, a.item(), float(a), int(a)
(tensor([3.5000]), 3.5, 3.5, 3)