pytorch之张量基础

张量的简介以及基础操作

PyTorch中最基本的操作对象就是tensor,表示一个多维矩阵,比如0维矩阵就是一个点,一维矩阵就是向量,二维矩阵就是一般的矩阵,多维矩阵就相当于一个多维数组,这个numpy是对应的。
在运行以下代码前先导库:

import torch
import numpy as np
import random

张量的多种创建方法

已有数据创建张量

#已有数据创建张量
def test01():

    # 1. 创建张量标量
    data = torch.tensor(10)
    print(data)

    # 2. numpy 数组, 由于 data 为 float64, 下面代码也使用该类型
    data = np.random.randn(2, 3)
    data = torch.tensor(data)
    print(data)

    # 3. 列表, 下面代码使用默认元素类型 float32
    data = [[10., 20., 30.], [40., 50., 60.]]
    data = torch.tensor(data)
    print(data)


test01()

运行结果如下:
在这里插入图片描述

创建指定形状的张量

# 2. 创建指定形状的张量
def test02():

    # 1. 创建2行3列的张量, 默认 dtype 为 float32
    data = torch.Tensor(2, 3)
    print(data)

    # 2. 注意: 如果传递列表, 则创建包含指定元素的张量
    data = torch.Tensor([10])
    print(data)

    data = torch.Tensor([10, 20])
    print(data)


test02()·

运行结果:
在这里插入图片描述

创建线性和随机张量

torch.arange 和 torch.linspace 创建线性张量

# 1. 创建线性空间的张量
def test01():

    # 1. 在指定区间按照步长生成元素 [start, end, step)
    data = torch.arange(0, 10, 2)
    print(data)

    # 2. 在指定区间按照元素个数生成
    data = torch.linspace(0, 11, 10)
    print(data)


test01()

运行结果:
在这里插入图片描述

张量元素类型转换

def test():

    data = torch.full([2, 3], 10)
    print(data.dtype)

    # 将 data 元素类型转换为 float64 类型

    # 1. 第一种方法
    data = data.type(torch.DoubleTensor)
    print(data.dtype)

    # 转换为其他类型
    # data = data.type(torch.ShortTensor)
    # data = data.type(torch.IntTensor)
    # data = data.type(torch.LongTensor)
    # data = data.type(torch.FloatTensor)

    # 2. 第二种方法
    data = data.double()
    print(data.dtype)

    # 转换为其他类型
    # data = data.short()
    # data = data.int()
    # data = data.long()
    # data = data.float()

test()

张量与numpy互转

将张量转换为 numpy 数组

注意:两个变量共用内存,如果需要相互独立,可以使用copy函数拷贝一份。

def test01():

    data_tensor = torch.tensor([2, 3, 4])
    # 使用张量对象中的 numpy 函数进行转换
    data_numpy = data_tensor.numpy()

    print(type(data_tensor))
    print(type(data_numpy))

    # 注意: data_tensor 和 data_numpy 共享内存
    # 修改其中的一个,另外一个也会发生改变
    # data_tensor[0] = 100
    data_numpy[0] = 100

    print(data_tensor)
    print(data_numpy)


test01()

numpy 转换为张量

使用 from_numpy 可以将 ndarray 数组转换为 Tensor,默认共享内存,使用 copy 函数避免共享
# 1. 使用 from_numpy 函数
def test01():

    data_numpy = np.array([2, 3, 4])
    data_tensor = torch.from_numpy(data_numpy)

    # nunpy 和 tensor 共享内存
    # data_numpy[0] = 100
    data_tensor[0] = 100

    print(data_tensor)
    print(data_numpy)


test01()
使用 torch.tensor 可以将 ndarray 数组转换为 Tensor,默认不共享内存
# 2. 使用 torch.tensor 函数
def test02():

    data_numpy = np.array([2, 3, 4])

    data_tensor = torch.tensor(data_numpy)

    # nunpy 和 tensor 不共享内存
    # data_numpy[0] = 100
    data_tensor[0] = 100

    print(data_tensor)
    print(data_numpy)


test02()

张量运算

张量基本运算

基本运算中,包括 add、sub、mul、div、neg 等函数, 以及这些函数的带下划线的版本 add_、sub_、mul_、div_、neg_,其中带下划线的版本为修改原数据。
以加法为例子:

rect1 = torch.tensor([ [1,2,3], [4,5,6] ])
rect2 = torch.tensor([ [1,2,3], [4,5,6] ])
rect1.add(rect2)
print("rect1 add",rect1)
rect1.add_(rect2)
print("rect1 _add",rect1)

# 补充
result = torch.add(rect1, rect2)
print("torch", result)

矩阵的点乘与乘积运算

点乘可以直接使用*也可以用上面的mul,乘积可以用@也可以用matmul

张量索引操作

简单行、列索引、范围索引

行列索引其实是范围索引的特列,他们类似于列表的切片
在这里插入图片描述

布尔索引

# 布尔索引
def test():

    # 第三列大于5的行数据
    print(data[data[:, 2] > 5])
    # 第二行大于5的列数据
    print(data[:, data[1] > 5])
if __name__ == '__main__':
    test04()

张量形状操作

1.reshape 函数可以在保证张量数据不变的前提下改变数据的维度,将其转换成指定的形状。
2.transpose 函数可以实现交换张量形状的指定维度
3.permute 函数可以一次交换更多的维度。
4.squeeze 函数用删除 shape 为 1 的维度,unsqueeze 在每个维度添加 1, 以增加数据的形状。

张量拼接操作

torch.cat 函数可以将两个张量根据指定的维度拼接起来.

def test():

    data1 = torch.randint(0, 10, [3, 5, 4])
    data2 = torch.randint(0, 10, [3, 5, 4])

    print(data1.shape)
    print(data2.shape)
    print('-' * 50)

    # 1. 按0维度拼接
    new_data = torch.cat([data1, data2], dim=0)
    print(new_data.shape)
    print('-' * 50)

    # 2. 按1维度拼接
    new_data = torch.cat([data1, data2], dim=1)
    print(new_data.shape)
    print('-' * 50)

    # 3. 按2维度拼接
    new_data = torch.cat([data1, data2], dim=2)
    print(new_data.shape)
    print('-' * 50)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值