学习内容23/10/7

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 + YX += 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'>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值