Pytorch之Tensor基本操作

pytorch中基本数据是一个tensor对象,类似于numpy中的ndarray。下面列举一些张量的简单使用方法。

(1)创建tensor

#创建未初始化的张量
x1 = torch.Tensor(3,2)
#创建随机的张量
x2 = torch.rand(3,2)
#创建全为1的张量
x3 = torch.ones(3,2)
#创建全为0的张量
x4 = torch.zeros(3,2)

#四个结果如下
tensor([[1.3527e+13, 5.8294e-43],
        [1.3153e+13, 5.8294e-43],
        [0.0000e+00, 0.0000e+00]])
tensor([[0.9475, 0.3748],
        [0.1038, 0.6830],
        [0.6550, 0.1775]])
tensor([[1., 1.],
        [1., 1.],
        [1., 1.]])
tensor([[0., 0.],
        [0., 0.],
        [0., 0.]])

(2)确定tensor形状

调用shape属性可以确定其形状

shape = x1.shape
print(shape[0])
print(shape[1])

#返回结果
3
2

(3)张量的简易数值运算

x = torch.ones(3,2)
#tensor([[1., 1.],
        [1., 1.],
        [1., 1.]])
y = torch.ones(3,2)+2
#tensor([[3., 3.],
        [3., 3.],
        [3., 3.]])
z=torch.ones(2,1)
#tensor([[1.],
        [1.]])
result = x*y@z
#tensor([[6.],
        [6.],
        [6.]])

其中符号 * 是点乘,指大小一样的tensor的相同位置进行乘法操作,@符号和matmul函数一样是矩阵乘积。

(4)转置连接等基本操作

x = torch.ones(2,3,4)
print(x)
x1 = x[1,:,:]
print(x1)
x2 = x[1,1,1]
print(x2)
#结果:
tensor([[[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]],

        [[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]])
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])
tensor(1.)

解释:创建了一个234的三维矩阵,x可以理解为2个34的二维矩阵,然后x2可以理解为选取了其中一个34的矩阵(第二个),x3表示选取了一个点

x = torch.rand(2,3)
print(x)
x1 = x[:,1:]
print(x1)
x2 = x[:-1,:]
print(x2)

#结果
tensor([[0.8884, 0.4229, 0.2552],
        [0.5975, 0.2205, 0.8982]])
tensor([[0.4229, 0.2552],
        [0.2205, 0.8982]])
tensor([[0.8884, 0.4229, 0.2552]])

解释:x是二维的随机张量,x1选取的是x的两行和从1开始的列(python是从0开始的),x2选取的是从第0行开始到-1行结束的值,-1表示倒数第一行,因为python是左闭右开的,所以选取了第一行。
不懂的可以看下下面这些操作,了解的可以跳过。

a='python'
 
b=a[::-1]
 
print(b) #nohtyp
 
c=a[::-2]
 
print(c) #nhy
 
#从后往前数的话,最后一个位置为-1
d=a[:-1]  #从位置0到位置-1之前的数
 
print(d)  #pytho
 
e=a[:-2]  #从位置0到位置-2之前的数
 
print(e)  #pyth

拼接操作,按行拼接和按列拼接

x = torch.rand(2,3)
print(x)
x1 = torch.cat((x,x))#x1等于torch.cat((x,x),dim=0)
print(x1)
x2 = torch.cat((x,x), dim=1)
print(x2)
#结果
tensor([[0.0787, 0.1899, 0.0054],
        [0.8835, 0.0500, 0.5895]])
tensor([[0.0787, 0.1899, 0.0054],
        [0.8835, 0.0500, 0.5895],
        [0.0787, 0.1899, 0.0054],
        [0.8835, 0.0500, 0.5895]])
tensor([[0.0787, 0.1899, 0.0054, 0.0787, 0.1899, 0.0054],
        [0.8835, 0.0500, 0.5895, 0.8835, 0.0500, 0.5895]])

stack和split

x = torch.rand(2,3)
print(x)
x1 = torch.stack((x,x), dim=0)
print(x1)
x2 = x.split(split_size=2,dim=1)
print(x2)
#结果
tensor([[0.2641, 0.9174, 0.3424],
        [0.7403, 0.8882, 0.6797]])
tensor([[[0.2641, 0.9174, 0.3424],
         [0.7403, 0.8882, 0.6797]],

        [[0.2641, 0.9174, 0.3424],
         [0.7403, 0.8882, 0.6797]]])
(tensor([[0.2641, 0.9174],
        [0.7403, 0.8882]]), tensor([[0.3424],
        [0.6797]]))

squeeze与unsqueeze

x = torch.rand(3,2,1)
print(x)
x1 = x.squeeze()
print(x1)
x2 = torch.rand(3)
print(x2)
x3 = x2.unsqueeze(0)
print(x3)
#结果
tensor([[[0.4308],
         [0.3849]],

        [[0.8603],
         [0.6125]],

        [[0.7925],
         [0.6389]]])
tensor([[0.4308, 0.3849],
        [0.8603, 0.6125],
        [0.7925, 0.6389]])
tensor([0.1343, 0.3331, 0.7231])
tensor([[0.1343, 0.3331, 0.7231]])

三个函数的区别如下图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45807161/article/details/123638222