12.5学习日志

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')
  1. 使用os.makedirs()函数创建一个名为data的文件夹。os.makedirs()函数的第一个参数是要创建的目录路径,os.path.join()函数用于创建正确的路径,将'..''data'连接起来形成'../data'os.makedirs()函数的第二个参数exist_ok=True表示如果目录已经存在,不会引发错误。
  2. 使用os.path.join()函数创建一个名为data_file的变量,它的值是'../data/house_tiny.csv',即data文件夹下的house_tiny.csv文件的路径。
  3. 使用open()函数以写入模式打开data_file文件,并将文件对象赋值给变量f
  4. 使用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[:]=2b中的所有元素修改为2。由于ab共享相同的内存存储,因此b的修改也会影响到a。因此,当您打印a时,您会看到所有元素都被修改为2。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值