1.X==Y
X,Y是形状相同的两个张量,通过“==”进行连接,所得“X==Y”为一个新的相同形状的张量。
“==” 的作用是将两个形状相同的张量同一位置的 元素 进行对比,同为True,不同为False,以此作为新张量中的元素。 连用时注意使用括号。 如下:
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]])
Z = torch.arange(12, dtype=torch.float32).reshape((3,4))
print(X==Y)
print((X==Y)==Z)
输出为:
tensor([[False, True, False, True],
[False, False, False, False],
[False, False, False, False]])
tensor([[ True, True, False, False],
[False, False, False, False],
[False, False, False, False]])
true等同于1,false等同于0. 展示如下:
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]])
print((X==Y)*2)
tensor([[0, 2, 0, 2],
[0, 0, 0, 0],
[0, 0, 0, 0]])
2.X.sum()
将X张量内所有元素进行求和,产生一个单元素张量。 如下:
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
print(X.sum())
tensor(66.)
3.a+b
广播机制
a,b是两个 不同形状 但 维度相同 且 至少有一个维度内元素数量为1 的张量。
在浅层运用层面,将沿着数组中长度为1的轴进行广播,a是列,b是行。如下例子:
a = torch.arange(3).reshape((3,1))
b = torch.arange(2).reshape((1,2))
print(a+b)
tensor([[0, 1],
[1, 2],
[2, 3]])
4.索引和切片
第一个元素的索引是0,最后一个元素索引是-1; 可以指定范围以包含第一个元素和最后一个之前的元素。
如下所示,我们可以用[-1]
选择最后一个元素,可以用[1:3]
选择第二个和第三个元素
X = torch.arange(12).reshape(3,-1)
print(X[-1])
print(X[1:3])
tensor([ 8, 9, 10, 11])
tensor([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
可以通过指定索引来将元素写入矩阵。如下
X = torch.arange(12).reshape(3,-1)
X[1, 2] = 9
print(X)
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 9., 7.],
[ 8., 9., 10., 11.]])
如果我们想为多个元素赋值相同的值,我们只需要索引所有元素,然后为它们赋值。 例如,[0:2,:]
访问第1行和第2行,其中“:”代表沿轴1(列)的所有元素。 虽然我们讨论的是矩阵的索引,但这也适用于向量和超过2个维度的张量。
X = torch.arange(12).reshape(3,-1)
X[0:2, :] = 12
print(X)
tensor([[12, 12, 12, 12],
[12, 12, 12, 12],
[ 8, 9, 10, 11]])
5.节省内存
如果我们用Y = Y + X
,我们将取消引用Y
指向的张量,而是指向新分配的内存处的张量。这是因为Python首先计算Y + X
,为结果分配新的内存,然后使Y
指向内存中的这个新位置。
有两种方法可以解决。
一、X,Y后续重复使用
首先创建一个新的矩阵Z
,其形状与另一个Y
相同, 使用zeros_like
来分配一个全0的块。
X = torch.arange(3)
Y = torch.arange(3)
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z))
id(Z): 2507631033904
id(Z): 2507631033904
二、X或Y后续不再使用
可以使用X[:] = X + Y
或X += Y
来减少操作的内存开销。
X = torch.arange(3)
Y = torch.arange(3)
before = id(X)
X += Y
print(id(X) == before)
True
6.转换为其他Python对象
将深度学习框架定义的张量转换为NumPy张量(ndarray
)很容易,反之也同样容易。 torch张量和numpy数组将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。
A = torch.ones(5)
B = A.numpy()
print(type(A),type(B))
<class 'torch.Tensor'> <class 'numpy.ndarray'>
或者
A = numpy.ones(5)
B = torch.from_numpy(A)
print(type(A), type(B))
<class 'numpy.ndarray'> <class 'torch.Tensor'>