【李沐-动手深度学习v2】笔记整理-04数据操作+数据预处理

N维数组

一个类别(0d):标量
一个特征向量(1d):向量
一个样本特征矩阵(2d):矩阵
RGB图片(3d):宽 × 高 × 通道
一个RGB图片批量(4d):批量大小 × 宽 × 高 × 通道
一个视频批量(5d):批量大小 × 时间 × 宽 × 高 × 通道

创建数组

形状、每个元素的数据类型、每个元素的值

访问元素

数据操作

import torch

# 张量表示一个数值组成的数组,这个数组可能有多个维度
x = torch.arange(12)   # tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
x_size = x.shape       # torch.Size([12])

x = torch.tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]])  # 两层括号表示2个维度  从后至前
x_dim = x.dim()     # 2
x_size = x.shape    # torch.Size([1, 12])

# 改变一个张量的形状而不改变其值
x = x.reshape(3,4)

# 使用全0、全1、其他向量或着从特定分布中随机采样的数字
x0 = torch.zeros((2,3))
x1 = torch.ones((2,3))

# 使用嵌套列表为所需张量中的每个元素赋予确定值
x = torch.tensor([[1,2,3],[3,2,1]])    # torch.Size([2, 3])
x = torch.tensor([[[1,2,3],[3,2,1]]])  # torch.Size([1, 2, 3])

# 按元素运算
a = torch.tensor([1.0,2,4,8])   # 浮点型数组
b = torch.tensor([2,2,2,2])
print(a+b)  # tensor([ 3.,  4.,  6., 10.])
print(a-b)  # tensor([-1.,  0.,  2.,  6.])
print(a*b)  # tensor([ 2.,  4.,  8., 16.])
print(a/b)  # tensor([0.5000, 1.0000, 2.0000, 4.0000])
print(a**b) # tensor([ 1.,  4., 16., 64.])  求幂运算

# 连结多个张量
x = torch.arange(12,dtype=torch.float32).reshape(3,4)  # 3行4列
y = torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]])    # 3行4列
print(torch.cat((x,y),dim=0))
# tensor([[ 0.,  1.,  2.,  3.],
#         [ 4.,  5.,  6.,  7.],
#         [ 8.,  9., 10., 11.],
#         [ 2.,  1.,  4.,  3.],
#         [ 1.,  2.,  3.,  4.],
#         [ 4.,  3.,  2.,  1.]])
print(torch.cat((x,y),dim=1))
# tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],
#         [ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],
#         [ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]])

# 通过逻辑运算符构建二元张量
print(x == y)
# tensor([[False,  True, False,  True],
#         [False, False, False, False],
#         [False, False, False, False]])

# 对张量中所有元素进行求和,会产生一个只有一个元素的张量
print(x.sum())  # tensor(66.)

# 广播机制:即使形状不同也可以执行按元素操作
m = torch.arange(3).reshape((3,1))
# tensor([[0],
#         [1],
#         [2]])
n = torch.arange(2).reshape((1,2))
# tensor([[0, 1]])
print(m+n)
# tensor([[0, 1],
#         [1, 2],
#         [2, 3]])

# 元素访问
print(x[-1])   # 访问最后一个元素
print(x[1:3])  # 访问第二个个第三个元素

# 通过指定索引来修改元素的值
x[1,2] = 9
print(x)
# tensor([[ 0.,  1.,  2.,  3.],
#         [ 4.,  5.,  9.,  7.],
#         [ 8.,  9., 10., 11.]])

# 通过索引区域赋值
x[0:2,:] = 12
print(x)
# tensor([[12., 12., 12., 12.],
#         [12., 12., 12., 12.],
#         [ 8.,  9., 10., 11.]])

# 运行一些操作可能会导致为新结果分配内存
before = id(y)
y = y + x      # y=y+x是新内存,y+=x是原地操作
print(before == id(y))  # False

# 执行原地操作
z = torch.zeros_like(y)
print(id(z))   # 2147130590336
z[:] = y + x
print(id(z))   # 2147130590336

# 转换为NumPy张量
A = x.numpy()
B = torch.tensor(A)
print(type(A),type(B))  # <class 'numpy.ndarray'> <class 'torch.Tensor'>

# 将大小为1的张量转换为Python张量
a = torch.tensor([3.5])
print(a,a.item(),float(a),int(a))  # tensor([3.5000]) 3.5 3.5 3

数据预处理

import os
import pandas as pd
import torch

# 创建一个人工数据集,并存储在csv(逗号分隔值)文件
os.makedirs(os.path.join('.','data'),exist_ok=True)
data_file = os.path.join('.','data','house_tiny.csv')
with open(data_file,'w') as f:
    f.write('NumRooms,Alley,Price\n')  # 列名
    f.write('NA,Pave,127500\n')        # 每行表示一个数据样本
    f.write('2,NA,106000\n')
    f.write('4,NA,178100\n')
    f.write('NA,NA,140000\n')

# 从创建的csv文件中加载原始数据集
data = pd.read_csv(data_file) # 使用pandas库读取
print(data)
#    NumRooms Alley   Price
# 0       NaN  Pave  127500
# 1       2.0   NaN  106000
# 2       4.0   NaN  178100
# 3       NaN   NaN  140000

# 处理缺失数据:插值/删除
inputs = data.iloc[:,0:2]
outputs = data.iloc[:,2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
#    NumRooms Alley
# 0       3.0  Pave
# 1       2.0   NaN
# 2       4.0   NaN
# 3       3.0   NaN
inputs = pd.get_dummies(inputs,dummy_na=True) # 对于inputs中的类别值或离散值,将“NaN”视为一个类别
print(inputs)
#    NumRooms  Alley_Pave  Alley_nan
# 0       3.0           1          0
# 1       2.0           0          1
# 2       4.0           0          1
# 3       3.0           0          1

# 目前inputs和outputs中的所有条目都是数值类型,可将其转换为张量格式
X,y = torch.tensor(inputs.values),torch.tensor(outputs.values)
print(X,y)
# tensor([[3., 1., 0.],
#         [2., 0., 1.],
#         [4., 0., 1.],
#         [3., 0., 1.]], dtype=torch.float64)
# tensor([127500, 106000, 178100, 140000])

QA互动

Q1:reshape和view的区别

b=a.reshape((x,x)),b相当于是a的视图,但是改b也会改a

Q2:tensor和array的区别

多维数组

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值