1 数据操作
N维数组是机器学习和神经网络的主要数据结构
0维数组是一个标量,表示一个类别
1维数组是一个向量,特征向量
2维数组是一个样本的特征矩阵,每一行表示一个样本,每一列表示不同特征
3维数组比如是RGB图片(宽*高*通道)宽是列数,高是行数
4维数组比如是一个RGB图片批量
5维可以是一个视频的批量
访问元素:
最后一个[::3,::2]表示从第0行开始每三行一跳,从第0列开始每两列一跳
2 数据操作实现
张量表示一个数值组成的数组,这个数组可能有多个维度
x=torch.arange(12)
#tensor([0,1,2,3,4,5,6,7,8,9,10,11])
1.可以通过张量的shape属性来访问张量的形状和张量中的元素
print(x.shape)
#torch.size([12])
print(x.numel)
#12
2.可以通过reshape改变张量的形状,但不改变元素数量和元素值
X = x.reshape([3,4])
print(X)
'''tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])'''
3.使用全0,全1,其他常量或者从特定分布中随机采样的
4.可以将多个张量连结在一起
import torch
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]])
print(torch.cat((x,y),dim = 0),
torch.cat((x,y),dim=1))
#dim=0并列列,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.]])'''
5.通过逻辑运算符构建二元张量,按照元素分别判断
import torch
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]])
print(x>=y)
'''tensor([[False, True, False, True],
[ True, True, True, True],
[ True, True, True, True]])
'''
6.即使形状不同也仍然可以通过调用广播机制(broadcasting mechanism)来执行按元素操作(只有在维度一样的情况下)
import torch
x = torch.arange(3).reshape((3,1))
y = torch.arange(2).reshape((1,2))
print(x+y)
'''tensor([[0, 1],
[1, 2],
[2, 3]])'''
7.可以用[-1] 访问最后一列元素,可以用[1:3]选择第二行和第三行元素
除读取外可以通过指定索引来将元素写入矩阵
x[1,2]=9,将第二行第三列元素写为9
也可以为多个元素赋值相同的值:
import torch
x = torch.arange(12).reshape((3,4))
X = x[0:2,:]=12
print(x)
'''tensor([[12, 12, 12, 12],
[12, 12, 12, 12],
[ 8, 9, 10, 11]])'''
8.运行一些操作可能会导致为新结果分配内存,比如当用一个值覆盖前一个值时,地址就会发生改变
要执行原地操作:
import torch
x = torch.arange(12).reshape((3,4))
y = x[0:2,:]=12
z = torch.zeros(3,4)
print('id(z):',id(z))
z = x + y
print('id(z):',id(z))
z[:] =x + y#表示只改变列表元素,给元素赋值
print('id(z):',id(z))
'''id(z): 2857300220240
id(z): 2857953786352
id(z): 2857953786352
'''
如果后续计算中没有重复使用x,也可以使用x[:]=x+y或者x+= y来减少操作的内存开销,此时地址也不会发生改变
9.python中最基础的数据类型numpy,转换为Numpy张量
import torch
x = torch.arange(12).reshape((3,4))
y = x[0:2,:]=12
A = x.numpy()
print(type(A))
#<class 'numpy.ndarray'>
将大小为1的张量转换为Python标量
import torch
a = torch.tensor([3.5])
print(a,a.item(),float(a),int(a))
#tensor([3.5000]) 3.5 3.5 3
3 数据预处理实现
创建一个人工数据集,并存储在csv文件
import os
os.makedirs(os.path.join('..','data'),exist_ok=True)
data_file = os.path.join('..','data','house_tiny.csv')#文件名是house_tiny.csv
with open(data_file,'w') as f:
f.write('A,B,C\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')
- 使用
os.makedirs()
函数创建一个名为data
的文件夹。os.makedirs()
函数的第一个参数是要创建的目录路径,os.path.join()
函数用于创建正确的路径,将'..'
和'data'
连接起来形成'../data'
。os.makedirs()
函数的第二个参数exist_ok=True
表示如果目录已经存在,不会引发错误。 - 使用
os.path.join()
函数创建一个名为data_file
的变量,它的值是'../data/house_tiny.csv'
,即data
文件夹下的house_tiny.csv
文件的路径。 - 使用
open()
函数以写入模式打开data_file
文件,并将文件对象赋值给变量f
。 - 使用
f.write()
方法向文件中写入数据。首先写入一行列名,即'A,B,C\n'
,其中\n
表示换行。然后写入多行数据样本,每行表示一个数据样本。数据样本由三个值组成,使用逗号分隔,例如'NA,Pave,127500\n'
。这些数据样本代表住房价格数据集的一部分。
data = pandas.read_csv(data_file)
print(data)
''' A B C
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
'''
处理缺失的数据,典型方法包括插值和删除
data = pandas.read_csv(data_file)
print(data)
inputs, outputs = data.iloc[:,0:2],data.iloc[:,2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
#会出现报错,原因是第一列为非数值的列无法进行均值计算
data = pandas.read_csv(data_file)
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
numeric_inputs = inputs.select_dtypes(include='number')#选取数值类型的元素
numeric_inputs = numeric_inputs.fillna(numeric_inputs.mean())#用列中剩下元素的均值来填充
print(numeric_inputs)
''' A
0 3.0
1 2.0
2 4.0
3 3.0'''
对于inputs中的类别值或者离散值(Pave或NaN),将“NAN”视为一个类别,通过0,1表示有或没有
data = pandas.read_csv(data_file)
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
numeric_inputs = inputs.select_dtypes(include='number')
numeric_inputs = numeric_inputs.fillna(numeric_inputs.mean())
inputs = pandas.get_dummies(inputs,dummy_na=True)
print(inputs)
''' A B_Pave B_nan
0 NaN True False
1 2.0 False True
2 4.0 False True
3 NaN False True
'''
更改b的元素,a的元素也会跟着改变
a = torch.arange(12)
b = a.reshape([3,4])
b[:]=2
print(a)
#tensor([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
接下来,通过b[:]=2
将b
中的所有元素修改为2。由于a
和b
共享相同的内存存储,因此b
的修改也会影响到a
。因此,当您打印a
时,您会看到所有元素都被修改为2。