【Python · PyTorch】数据基础

news2024/11/18 14:53:18

数据基础

  • 1. 数据操作
    • 1.1 入门
    • 1.2 运算符
    • 1.3 广播机制
    • 1.4 索引和切片
    • 1.5 节省内存
    • 1.6 转化为其他Python对象
  • 2. 数据预处理
    • 2.1 读取数据集
    • 2.2 处理缺失值
    • 2.3 转换为张量格式

本文介绍了PyTorch数据基础,Python版本3.9.0,代码于Jupyter Lab中运行,以尽可能简单的文字阐述相关内容。

1. 数据操作

1.1 入门

首先,我们先导入torch,在python中PyTorch被称作torch。

import torch

导入PyTorch

张量表示一个由数值(元素)组成的数组,其可能具有多个维度,即可在多个坐标轴上表示。

  • 一维张量:向量(vector)
  • 二维张量:矩阵(matrix)

我们调用arange函数创建一个行向量x,其包含从0开始前20个整数,默认为整数,也可被指定为浮点数。

x = torch.arange(20)

arange

调用python内置函数type可得知,创建的x为torch中的Tensor(张量)对象。

type(x)
# <class 'torch.Tensor'>

type

我们调用reshape函数可以改变一个张量的形状且不改变元素数量、元素值,下面我们对x向量作变换,得到4*5矩阵y。

y = x.reshape(4, 5)
z = x.reshape(5, 6)    # 当我们试图变换超过其总元素大小时,程序会抛出异常

reshape

当矩阵元素数量足够多时,我们不需要手动指定每个维度改变形状,可以使用-1来表示其中一个维度,如下所示。

z = x.reshape(5,-1)
y1 = x.reshape(4,-1)

reshape

我们通过shape属性访问张量的形状,通过numel获知其元素总量(大小),如下所示,我们分别对x和y做如上操作。

x.shape                  # 表示x矩阵的形状
x.numel()                # 表示x矩阵的元素总量

y.shape                  # 表示x矩阵的形状
y.numel()                # 表示x矩阵的元素总量

shape & numel

通过zerosones函数创建任意形状的全0、全1元素矩阵。

torch.zeros(2, 3)

torch.ones(3, 4)

zeors & ones

有时我们想从某个特定的概率分布中随机采样得到每个元素的值,通过randn函数创建一个每个元素都从均值为0、方差为1的标准高斯分布(正态分布)中随机采样的矩阵。

torch.randn(3, 4)

randn

1.2 运算符

下面介绍张量如何逐元素运算。

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)
# tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])

exp

下面介绍如何将多个张量连接在一起,首先创建两个矩阵

X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])

创建张量

分别对矩阵做纵向、横向拼接。


# 纵向拼接
torch.cat((X, Y), dim=0)
# 横向拼接
torch.cat((X, Y), dim=1)

cat

我们可以通过==对两矩阵逐元素进行比较,可以得到各元素均为布尔型的矩阵。

X == Y

==

对张量中所有元素求和,会产生一个单元素张量。

X.sum()

sum

1.3 广播机制

广播机制的工作方式如下:

  1. 通过适当复制元素来扩展一个或两个数组,使其转换后具有相同的形状
  2. 对生成的数组执行按元素操作

多数情况下,我们沿着数组中长度为1的轴进行广播。

a = torch.arange(3).reshape((3,1))
b = torch.arange(2).reshape((1,2))

创建张量

其形状不匹配,我们可以将其广播为一个更大的3×2的矩阵。

a + b

广播机制

1.4 索引和切片

我们可以使用[-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素:

X[-1], X[1:3]

索引

我们还可以通过索引的方式将单个元素写入矩阵:

X[1,2] = 9
X

索引写入

我们还可以通过这种方式为多个元素赋予相同的值,只需索引所有元素,如:

X[0:2, :] = 12       # 本例代表访问第1行和第2行,其中":"代表沿轴(列)的所有元素
X

索引写入

以上方法均适用于超过2个轴的其他类型的张量。

1.5 节省内存

当我们执行Y = Y + X操作后,Python会首先计算Y + X,为结果分配新的内存,然后使Y指向内存中的这个新位置。

这是不可取的:

  • 机器学习中,可能有数百兆参数,我们希望原地执行这些更新。
  • 若不原地更新,其他引用可能仍会指向旧的位置,可能会无形中引用旧的参数。

执行原地操作的方法很简单,可以使用切片操作执行。如Y[:]=<expression>

我们可以先创建一个新的矩阵Z,其为全零矩阵,与先前X的形状相同,然后比较其ID:

print('id(Z):', id(Z))
# id(Z): 2502249091776
Z[:] = X + X
print('id(Z):', id(Z))
# id(Z): 2502249091776

原地操作

1.6 转化为其他Python对象

将张量在torch框架与numpy框架间转换很容易,它们将共享底层内存,就地操作一个也会改变另一个张量。

A = X.numpy()
B = torch.tensor(A)
type(A), type(B)
# (<class 'numpy.ndarray'>, <class 'torch.Tensor'>)

tensor与numpy相互转换

将大小为1的张量转化为Python标量,有多种方法:

a = torch.tensor([3.5])
a, a.item(), float(a), int(a)
# (tensor([3.5000]), 3.5, 3.5, 3)

张量与标量相互转换

2. 数据预处理

2.1 读取数据集

我们先创建一个数据集,并按行写入CSV文件中:

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')           # 每行表示一个数据样本
        f.write('2, NA, 106000\n')
        f.write('4, NA, 178100\n')
        f.write('NA, NA, 140000\n')

随后导入pandas包,并调用read_csv函数

import pandas as pd

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

数据预处理

2.2 处理缺失值

NaN代表缺失值,处理的典型方法包括插值法删除法,插值法即用替代值弥补,删除法则忽视缺失值。

本例中,我们采用插值法。

通过位置索引函数iloc将数据分成inputs和outputs,其中inputs为data前两列,outputs为最后一列。

fillna函数可以使用传入参数值代替NaN缺失值,而mean函数可以求得其对应的平均值。

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)

iloc函数,属于pandas库,全称为index location,即对数据进行位置索引,从而在数据表中提取出相应的数据。

iloc

对于inputs中的类别值或离散值,NaN可视作一个类别,而NA被视为字符串。由于Alley列有NA、Pave和NaN三个类别,Pandas可自动将其分为三列Alley_NAAlley_PaveAlley_nan。值激活为1,不激活为0。

inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)

pd.get_dummies相当于onehot编码,常用与把离散的类别信息转化为onehot编码形式。

get_dummies

2.3 转换为张量格式

通过调用type函数,我们发现pandas及分割后的数据均为<class 'pandas.core.frame.DataFrame'>类型。

我们可调用tneser函数将上述类型的数据转化为PyTorch张量(即<class torch.Tensor>类型)。

import torch

X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
X, y

pandas中DataFrame转换为torch张量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1124889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux系统安装jdk

1.从官网下载jdk包,Java Archive Downloads - Java SE 8u211 and later 2.创建java目录并上传jdk包 mkdir -p /home/local/java 3.解压jdk包 cd /home/local/java tar -zxvf /home/local/java/jdk-8u381-linux-x64.tar.gz 4.配置环境变量 vim /etc/profile i export JAV…

关于数据可视化那些事

干巴巴的数据没人看&#xff0c;数据可视化才能直观展现数据要点&#xff0c;提升数据分析、数字化运营决策效率。那关于可视化的实现方式、技巧、工具等&#xff0c;你了解几分&#xff1f;接下来&#xff0c;我们就来聊聊数据可视化那些事。 1、什么是数据可视化&#xff1f…

酒精壁炉:独特的室内取暖方式

酒精壁炉是一种现代而引人注目的室内取暖方式&#xff0c;其独特之处在于使用酒精作为唯一的燃料源。这种现代壁炉设计旨在为家庭带来温暖和舒适&#xff0c;同时呈现出简约而时尚的外观。 1、无需烟囱的壁炉 传统壁炉通常需要烟囱或排气系统&#xff0c;以排除燃烧过程中产生…

Java赋值运算符(=)

赋值运算符是指为变量或常量指定数值的符号。赋值运算符的符号为“”&#xff0c;它是双目运算符&#xff0c;左边的操作数必须是变量&#xff0c;不能是常量或表达式。 其语法格式如下所示&#xff1a; 变量名称表达式内容 在 Java 语言中&#xff0c;“变量名称”和“表达式…

RISC-V架构——物理内存保护机制设置函数(pmp_set)解析

1、物理内存保护机制 参考博客&#xff1a;《RISC-V架构——物理内存属性和物理内存保护》&#xff1b; 2、pmp_set函数源码 int pmp_set(unsigned int n, unsigned long prot, unsigned long addr,unsigned long log2len) {int pmpcfg_csr, pmpcfg_shift, pmpaddr_csr;unsign…

【C++和数据结构】位图和布隆过滤器

目录 一、位图 1、位图的概念 2、位图的实现 ①、基本结构 ②、set ③、reset&#xff1a; ④、test ⑤、问题&#xff1a; ⑥、位图优缺点及应用&#xff1a; ⑦、完整代码及测试 二、布隆过滤器 1、布隆过滤器的提出 2、布隆过滤器的实现 ①、基本结构 ②…

初识测开/测试

前言 在进入软件测试的正式讲解之前&#xff0c;我们需要对这个行业有一个整体的了解。 当我们从软件开发转向软件测试的时候&#xff0c;多数公司是欢迎的&#xff0c;而且难度也小。 反之&#xff0c;当我们从软件测试转向软件开发的时候&#xff0c;难度将会变得很大。 关于…

《持续交付:发布可靠软件的系统方法》- 读书笔记(七)

持续交付&#xff1a;发布可靠软件的系统方法&#xff08;七&#xff09; 第 7 章 提交阶段7.1 引言7.2 提交阶段的原则和实践7.2.1 提供快速有用的反馈7.2.2 何时令提交阶段失败7.2.3 精心对待提交阶段7.2.4 让开发人员也拥有所有权7.2.5 在超大项目团队中指定一个构建负责人 …

Mock测试详细教程入门这一篇就够了!

1、什么是mock测试 1.png Mock测试就是在测试活动中&#xff0c;对于某些不容易构造或者不容易获取的比较复杂的数据/场景&#xff0c;用一个虚拟的对象(Mock对象)来创建用于测试的测试方法。 2、为什么要进行Mock测试 Mock是为了解决不同的单元之间由于耦合而难于开发、测试…

01-React入门

React概述 react是什么&#xff1f; React用于构建用户界面的JS库。是一个将数据渲染为HTML视图的开源JS库。 为什么学&#xff1f; 1.原生JS操作DOM繁琐&#xff0c;效率低 2.使用JS直接操作DOM,浏览器会进行大量的重绘重排 3.原生JS没有组件化编码方案&#xff0c;代码…

【GA-LSSVM预测】基于遗传算法优化最小二乘支持向量机的回归预测(MATLAB代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

数字化转型如何影响企业全要素生产率(2007-2022年)

参照赵宸宇等&#xff08;2021&#xff09;的做法&#xff0c;本团队对来自财贸经济《数字化转型如何影响企业全要素生产率》一文中的基准回归部分进行复刻 一、数据介绍 数据名称&#xff1a;数字化转型如何影响企业全要素生产率 数据范围&#xff1a;上市公司 数据年份&am…

NSSCTF第8页(2)

[LitCTF 2023]就当无事发生 没有环境 [MoeCTF 2022]ezhtml 在js代码找到了flag [HNCTF 2022 WEEK2]ez_ssrf 题目描述说让我们访问index.php,看到了代码 传入的data会base64解码&#xff0c;传参port和host&#xff0c;还有一个没见过的函数fsockopen 查了一下 fsockopen函…

驱动开发LED灯绑定设备文件

头文件 #ifndef __HEAD_H__ #define __HEAD_H__typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t;#define PHY_LED1_ADDR 0x50006000 #define PHY_LED2_ADDR 0x50007000 #defin…

计算机算法分析与设计(18)---回溯法(介绍、子集和问题C++代码)

文章目录 一、回溯法介绍二、子集和问题2.1 知识概述2.2 代码编写 一、回溯法介绍 1. 回溯法&#xff08;back tracking&#xff09;是一种选优搜索法&#xff0c;又称为试探法&#xff0c;有“通用的解题法”之称&#xff0c;按选优条件向前搜索&#xff0c;以达到目标。但当探…

vue3 v-model的使用

&#x1f642;博主&#xff1a;锅盖哒 &#x1f642;文章核心&#xff1a;vue3 v-model的使用 目录 前言 什么是v-model&#xff1f; 基本的v-model用法 自定义组件中的v-model 前言 当涉及到Vue.js 3的前端开发时&#xff0c;v-model是一个不可或缺的工具&#xff0c;它…

从REST到GraphQL:升级你的Apollo体验

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

CPU寄存器与寻址方式

CPU寄存器与寻址方式 1 CPU寄存器2 表达数据位置3 寻址方式3.1 直接寻址3.2 寄存器间接寻址3.3 寄存器相对寻址3.4 基址变址寻址3.5 相对基址变址寻址3.6 按比例变址寻址&#xff08;SIB&#xff09; 本文属于《 X86指令基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 C…

CDN+Nginx反向代理来隐藏c2地址

思路&#xff1a;通过借助CDN和Nginx反向代理和HTTPS来隐藏真实c2服务器Nginx反向代理&#xff1a;通过Nginx对外部流量转发到本地&#xff0c;再设置防火墙只允许localhost访问cs端口达到IP白名单的效果 准备 在这个实验环境中&#xff0c;我们需要准备服务器两台(一台服务端…