d2l

2.1 数据处理

import torch
# 张量
x = torch.arrange(12)
x

# 通过shape访问张量的形状
x.shape

# 元素的种数
x.numel()

# 改变张量的形状而不改变元素的数量和元素值
X = x.reshape(3, 4)
X

# 创建全0/全1的元素的张量
torch.zeros((2,3,4))
torch.ones((2,3,4))

# 通过python的列表创建张量
torch.tensor([[2,1,4,3], [1,2,3,4], [4,3,2,1]]).shape

# 常见的标准算术运算
x = torch.tensor([1.0,2,4,8])
y = torch.tensor([2,2,2,2])
x=y, x-y, x*y, x/y, x**y

# 更多运算:按指数运算
torch.exp(x)

# 把多个张量连结在一起
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]])
torch.cat((X,Y), dim=0) # 在第0维合并,按行合并,就是堆起来
torch.cat((X,Y), dim=1) # 在第1维合并,按列合并

# 通过逻辑运算符构建二维张量
X == Y

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

# 广播机制 broadcasting mechanism
a = torch.arange(3).reshape((3,1))
b = torch.arange(2).reshape((1,2))
a, b
# 维度是一样的情况下可以实现广播机制 这里注意容易错误
a + b

# 元素访问
X[-1] # 最后一行
X[1:3] # 第二和第三个元素

# 通过索引将元素写入矩阵
X[1, 2] = 9
X

# 为多个元素赋值相同的值 按区域赋值
X[0:2, :] = 12
X

# 运行一些操作可能会导致为新结果分配内存
before = id(Y)
Y = Y + X
id(Y) == before # False 新的不等于旧的
## 原地操作
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z))

# 使用X[:]=X+Y或X+=Y来减少操作的内存开销
before = id(X)
X += Y
id(X) == before # Ture

# 转换为Numpy张量
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)

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

2.2 数据预处理

import os
# 创建文件夹
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')  # 每行表示一个数据样本 NA为未知的数
    f.write('2,NA,106000\n')
    f.write('4,NA,178100\n')
    f.write('NA,NA,140000\n')
# 安装pandas用于数据分析
# 如果没有安装pandas,只需取消对以下行的注释来安装pandas
# !pip install pandas
import pandas as pd

data = pd.read_csv(data_file)
print(data)

# 处理丢失的数据
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] # iloc indexlocation
inputs = inputs.fillna(inputs.mean(numeric_only=True)) # fillna 对所有是NA的数据填入一个值 input.mean 代表均值
print(inputs)

# 对于不是数值的操作 把出现的不同种类的数值都变成一个特征
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)

# 把数值转换成tensor
import torch
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y