*[::3 , ::2]的意思为:每3行一跳,每2列一跳*注:以下代码块为Jupiter Notebook代码块,前后代码有关联;被注释掉的内容为代码块的即时输出([out]部分)。张量表示由一个数值组成的数组,这个数组可能有多个维度x = torch.arange(12)x# x = tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
可以通过张量的 shape 属性来访问张量的形状 和张量中元素的总数x.shape # torch.Size([12])x.numel() # 12#注:numel的意思是number of elements
要改变一个张量的形状而不改变元素数量和元素值,可以调用 reshape 函数X = x.reshape(3, 4)X""" tensor([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])"""
使用全0、全1、其他常量或者从特定分布中随机采样的数字torch.zeros((2, 3, 4))""" 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.]]])"""torch.ones((2, 3, 4))"""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.]]])"""torch.randn(3, 4)"""tensor([[ 0.2104, 1.4439, -1.3455, -0.8273], [ 0.8009, 0.3585, -0.2690, 1.6183], [-0.4611, 1.5744, -0.4882, -0.5317]])"""
通过提供包含数值的 Python 列表(或嵌套列表)来为所需张量中的每个元素赋予确定值torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])"""tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])"""
常见的标准算术运算符(+、-、*、/ 和 **)都可以被升级为按元素运算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"""(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.])) """
torch.exp(x)# tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])
也可以把多个张量 连结(concatenate) 在一起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), torch.cat((X, Y), dim=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.]])) """
X == Y"""tensor([[False, True, False, True], [False, False, False, False], [False, False, False, False]])"""
对张量中的所有元素进行求和会产生一个只有一个元素的张量即使形状不同,我们仍然可以通过调用 广播机制 (broadcasting mechanism) 来执行按元素操作。但有时候,在写代码时没有注意广播机制也可能会产生bug。a = torch.arange(3).reshape((3, 1))b = torch.arange(2).reshape((1, 2))a, b"""(tensor([[0], [1], [2]]), tensor([[0, 1]]))"""a + b"""tensor([[0, 1], [1, 2], [2, 3]])"""
可以用 [-1] 选择最后一个元素,可以用 [1:3] 选择第二个和第三个元素X[-1], X[1:3]"""(tensor([ 8., 9., 10., 11.]), tensor([[ 4., 5., 6., 7.], [ 8., 9., 10., 11.]]))"""
X[1, 2] = 9X"""tensor([[ 0., 1., 2., 3.], [ 4., 5., 9., 7.], [ 8., 9., 10., 11.]])"""
为多个元素赋值相同的值,我们只需要索引所有元素,然后为它们赋值X[0:2, :] = 12X"""tensor([[12., 12., 12., 12.], [12., 12., 12., 12.], [ 8., 9., 10., 11.]])"""
before = id(Y)Y = Y + Xid(Y) == before# False
Z = torch.zeros_like(Y)print('id(Z):', id(Z))Z[:] = X + Yprint('id(Z):', id(Z))# id(Z): 140452400950336# id(Z): 140452400950336
如果在后续计算中没有重复使用 X,我们也可以使用 X[:] = X + Y 或 X += Y 来减少操作的内存开销before = id(X)X += Yid(X) == before# True
A = X.numpy()B = torch.tensor(A)type(A), type(B)# (numpy.ndarray, torch.Tensor)
a = torch.tensor([3.5])a, a.item(), float(a), int(a)# (tensor([3.5000]), 3.5, 3.5, 3)
创建一个人工数据集,并存储在csv(逗号分隔值)文件
import osos.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')
import pandas as pddata = pd.read_csv(data_file)print(data)"""输出结果:(NA:数据缺失) NumRooms Alley Price0 NaN Pave 1275001 2.0 NaN 1060002 4.0 NaN 1781003 NaN NaN 140000"""
为了处理缺失的数据,典型的方法包括插值和删除, 这里,我们将考虑插值(iloc的意思为index location ,范围同样为左闭右开)inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]inputs = inputs.fillna(inputs.mean())print(inputs)"""输出结果: NumRooms Alley0 3.0 Pave1 2.0 NaN2 4.0 NaN3 3.0 NaN"""
对于inputs中的类别值或离散值,我们将“NaN”视为一个类别*注意:关于处理缺失值报错的问题:torch 2.0会默认使用True和False,替换原来的0和1,在后续代码可能报错。可以增加一个属性到get_dummies中:dtype=floatinputs = pd.get_dummies(inputs, dummy_na=True)print(inputs)"""输出结果: NumRooms Alley_Pave Alley_nan0 3.0 1 01 2.0 0 12 4.0 0 13 3.0 0 1"""
现在inputs和outputs中的所有条目都是数值类型,它们可以转换为张量格式import torchX, y = torch.tensor(inputs.values), torch.tensor(outputs.values)X, y"""(tensor([[3., 1., 0.], [2., 0., 1.], [4., 0., 1.], [3., 0., 1.]], dtype=torch.float64), tensor([127500, 106000, 178100, 140000])) """