x = torch.arange(12) # 张量(tensor)表示由一个数值组成的数组,这个数组可能有多个维度。
print(x) # tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
print(x.shape) # 用shape访问张量的形状 torch.Size([12])
print(x.numel()) # 访问元素中的总数 12
x = x.reshape(3, 4) # 改变张量的形状而不改变元素的值 crtl+/可以批量注释代码 (H,W)(行,列)
print(x)
# tensor([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
x = torch.zeros((2, 3, 4)) # 使用全0生产一个张量 (C,H,W)(通道,行,列)
print(x)
# tensor([[[0., 0., 0., 0.],
# [0., 0., 0., 0.],
# [0., 0., 0., 0.]],
#
# [[0., 0., 0., 0.],
# [0., 0., 0., 0.],
# [0., 0., 0., 0.]]])
x = torch.ones((2, 3, 4)) # 使用全1生产一个张量
print(x)
# 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.]]])
x = torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) # 通过嵌套列表[]创建一个二维数组
print(x)
# tensor([[2, 1, 4, 3],
# [1, 2, 3, 4],
# [4, 3, 2, 1]])
x = torch.tensor(
[[[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]], [[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]]) # 通过嵌套列表[]创建一个三维数组
print(x)
# tensor([[[2, 1, 4, 3],
# [1, 2, 3, 4],
# [4, 3, 2, 1]],
#
# [[2, 1, 4, 3],
# [1, 2, 3, 4],
# [4, 3, 2, 1]]])
# x + y, x - y, x * y, x / y, x ** y **运算符是求幂运算
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
print(x + y)
print(x - y)
print(x * y)
print(x / y)
print(x ** y) # 底是x,幂次是y
print(torch.exp(x)) # 求指数的运算
# tensor([ 3., 4., 6., 10.])
# tensor([-1., 0., 2., 6.])
# tensor([ 2., 4., 8., 16.])
# tensor([0.5000, 1.0000, 2.0000, 4.0000])
# tensor([ 1., 4., 16., 64.])
# tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])
# 可以把多个张量连接在一起
x = torch.arange(12, dtype=torch.float32).reshape((3, 4)) # 按浮点型生产一个0-11的一维数组再变成一个3*4的二维数组
y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
print(x)
print(y)
c = torch.cat((x, y), dim=0) # 把两个元素合并在一起,在0维度的情况下(在行)
d = torch.cat((x, y), dim=1) # 把两个元素合并在一起,在1维度的情况下(在列)
print(c)
print(d)
# tensor([[ 0., 1., 2., 3.],
# [ 4., 5., 6., 7.],
# [ 8., 9., 10., 11.]])
# tensor([[2., 1., 4., 3.],
# [1., 2., 3., 4.],
# [4., 3., 2., 1.]])
# 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.]])
# 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.]])
# 通过逻辑运算符构建二元张量
a = torch.arange(1, 13).reshape(3, 4)
b = torch.arange(13, 25).reshape(3, 4)
print(a)
print(b)
print(a == b)
# tensor([[ 1, 2, 3, 4],
# [ 5, 6, 7, 8],
# [ 9, 10, 11, 12]])
# tensor([[13, 14, 15, 16],
# [17, 18, 19, 20],
# [21, 22, 23, 24]])
# tensor([[False, False, False, False],
# [False, False, False, False],
# [False, False, False, False]])
print(a.sum()) # 数组所有元素求和 tensor(78)
# 即使形状不同(要保证是同维度),仍然可以通过广播机制就行元素操作,即统一为3*2(行的最大,列的最大)
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
print(a + b)
# tensor([[0, 1],
# [1, 2],
# [2, 3]])
# 元素的访问
x = torch.arange(12).reshape((3, 4))
print(x)
print(x[1, 2])
print(x[-1]) # 访问最后一行元素
print(x[1:3]) # 访问2-3行元素
# tensor([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
# tensor(6)
# tensor([ 8, 9, 10, 11])
# tensor([[ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
# 元素的赋值
x = torch.arange(12).reshape((3, 4))
x[1, 2] = 9
x[2:3, :] = 12 # 把第三行都变成12
print(x)
# tensor([[ 0, 1, 2, 3],
# [ 4, 5, 9, 7],
# [12, 12, 12, 12]])
# 运行一些操作会导致为新结果分配内存
c = 1
b = 2
before = id(c)
c = c + b
print(before == id(c))
a = torch.arange(1, 13).reshape(3, 4)
b = torch.arange(13, 25).reshape(3, 4)
before = id(a)
a = a + b # 这里的a是创建新的内存来存放
print(before == id(a))
# 执行原地操作
z = torch.zeros_like(a)
before = id(z)
z[:] = a + b # z[:]是指对z的元素进行改写
print(before == id(z))
a = torch.arange(1, 13).reshape(3, 4)
b = torch.arange(13, 25).reshape(3, 4)
before = id(a)
a[:] = a + b # 这里的a[:]=a+b和a+=b都是直接改写a,没有新建新的变量,可以减少内存开销
a += b
print(before == id(a))
# 转换numpy张量
a = torch.arange(1, 13).reshape((3, 4))
a = a.numpy()
b = torch.tensor(a)
print(type(a), type(b))
# 将大小为1的张量转换为python标量
a = torch.tensor([3.5])
print(a, a.item(), float(a), int(a))
# <class 'numpy.ndarray'> <class 'torch.Tensor'>
# tensor([3.5000]) 3.5 3.5 3
代码如下(示例):
import os
import pandas as pd
import torch
os.makedirs(os.path.join('', 'data'), exist_ok=True) # os.path.join用于拼接文件路径
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')
f.close()
data = pd.read_csv(data_file)
print(data)
# 为了处理缺失的数据,典型的方法包括插值和删除,这里考虑插值法
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] # iloc[a,b] 对数据进行位置索引,从而在数据表中提取出相应的数据。 a是行索引,b是列索引
inputs = inputs.fillna(inputs.mean())
print(inputs)
print(outputs)
# 对于inputs中的类别值或离散值,我们将nan视为一个类别
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
# 现在inputs和outputs中所有条目都是数值类型,它们可以转换为张量格式。
x,y = torch.tensor(inputs.values),torch.tensor(outputs)
print(x)
print(y)
####################
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
0 127500
1 106000
2 178100
3 140000
Name: Price, dtype: int64
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
tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=torch.float64)
tensor([127500, 106000, 178100, 140000])
Process finished with exit code 0