【Python · PyTorch】数据基础

数据基础

  • 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 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')

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

import pandas as pddata = 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 torchX, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
X, y

pandas中DataFrame转换为torch张量

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-[5]客户端与服务端连接

红队专题 招募六边形战士队员端操作系统SystemInfo类获取系统信息发送系统信息头文件声明头文件调用 未找到来自 OleAcc.dll 的导入LINK 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 端 发送连接->进入主线程->返回socket->…

[SWPUCTF 2023 秋季新生赛] web题解

文章目录 colorful_snakeNSS_HTTP_CHEKER一键连接!ez_talkPingpingpingUnS3rialize查查needIf_elseRCE-PLUSbackup colorful_snake 打开题目&#xff0c;查看js源码 直接搜flag 把那三行代码复制到控制器&#xff0c;得到flag NSS_HTTP_CHEKER 都是http请求基本知识 抓包按照…

【保姆级教程】:docker搭建MongoDB三节点副本集

容器可以理解为一个进程&#xff0c;镜像是把环境&#xff0c;组件等都配置好&#xff0c;运行成容器的&#xff0c;容器里面运行服务&#xff0c;也可以说是一个进程。镜像是模板&#xff0c;镜像是实例。 一个镜像可以创建多个实例。也就是多个容器&#xff0c;容器之间相互…

驱动作业10.23

现象 test.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include "head.h"in…

TCP/IP(二十)TCP 实战抓包分析(四)TCP 第二次握手 SYN、ACK 丢包

一 实验二&#xff1a;TCP 第二次握手 SYN、ACK 丢包 重点&#xff1a; 通过设置 tcp_synack_retries 和 tcp_syn_retries内核参数,观察丢包的现象 ① 实验环境 iptables -t filter -I INPUT -s 172.25.2.100 -j DROPtcpdump -nni ens3 tcp and host 172.25.2.100 and por…

蛇口街道小区长者服务示范点 ——在家门口“乐享晚年”

2023年9月28日&#xff0c;深圳市南山区蛇口街道创建健康街道行动之“老年肌少症免费筛查”项目走进了海昌社区&#xff0c;为数十位长者开展了系统筛查。在家门口就能够享受到由蛇口医院康复科医生提供的专业服务&#xff0c;这对于小区的老人们来说还是第一次。自今年7月以来…

python之代理ip的配置与调试方法详解

代理IP在Python中是一种强大的工具&#xff0c;它可以用于隐藏真实IP地址、绕过访问限制、提高数据爬取和网络请求的效率等。下面将详细介绍Python中代理IP的配置与调试方法&#xff0c;帮助您更好地理解和应用代理IP。 1. 选择合适的代理IP 在使用代理IP之前&#xff0c;需要…

自然语言处理---Transformer构建语言模型

语言模型概述 以一个符合语言规律的序列为输入&#xff0c;模型将利用序列间关系等特征&#xff0c;输出一个在所有词汇上的概率分布&#xff0c;这样的模型称为语言模型。 # 语言模型的训练语料一般来自于文章&#xff0c;对应的源文本和目标文本形如: src1 "I can do&…

硬件服务器更换IPMI

重启按F2进入Biso界面 然后进入Server Management界面&#xff0c;选择BMC LAN Configuration

excel怎么固定前几行前几列不滚动?

在Excel中&#xff0c;如果你想固定前几行或前几列不滚动&#xff0c;可以通过以下几种方法来实现。详细的介绍如下&#xff1a; **固定前几行不滚动&#xff1a;** 1. 选择需要固定的行数。例如&#xff0c;如果你想要固定前3行&#xff0c;应该选中第4行的单元格。 2. 在E…

Markdown语法详解

文章目录 [toc] 一、简介二、样式1. 标题2. 字体3. 引用4. 分割线5. 图片6. 超链接7. 列表8. 表格9. 代码 一、简介 以前写学习文档常用的软件都是Word或者CSDN自带的编辑器&#xff0c;但Word用起来不太灵活&#xff0c;而CSDN自带编辑器又感觉逼格不够&#xff08;主要原因&…

c语言练习91:合并两个有序链表

合并两个有序链表 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码1&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct Li…

AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 (一)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 参考资料&#xff1a; UltraScale Architecture GTH Transceive…

驱动开发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…

【Java集合类面试六】、 HashMap有什么特点?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;HashMap有什么特点&…

ONEPIECE!程序环境和预处理——C语言最终章

时间过得飞快呀&#xff0c;从第一篇blog到现在&#xff0c;已经有三四个月的时间了&#xff0c;而我们终于也迎来了C语言的最终章——程序环境和预处理&#xff01;加油吧朋友们&#xff0c;ONEPIECE就在眼前~ 目录 一、程序的"翻译环境"和"运行环境" 二…

VUE到底有什么好处?

网上有许多前端开发框架的对比&#xff0c;相对的&#xff0c;VUE在综合评分方面还是优秀的。以下是一些State of JavaScript调查数据结果&#xff1a; 使用率&#xff1a;VUE使用者在调研开发者中占比 51%&#xff1b; 开发者满意度&#xff1a;VUE的综合开发者满意度达到64%…

springcloud笔记 (8) -网关 Gateway

网关 出国需要过海关 网关&#xff1a;网络的关卡 网关的作用 1&#xff1a;路由转发 2&#xff1a;安全控制 保护每个服务&#xff0c;不需要将每个暴露出去 3&#xff1a;负载均衡 1.没有网关&#xff1a;客户端直接访问我们的微服务&#xff0c;会需要在客户端配置很多…

ZooKeeper下载、安装、配置和使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

用“价值”的视角来看安全:《构建新型网络形态下的网络空间安全体系》

文章目录 写在前面安全认知的硬核概念威胁的演化路径与发展趋势构建网络空间安全体系好书推荐 写作末尾 写在前面 网络空间安全体系是建立在先进技术、严密监控和综合策略之上的综合性框架&#xff0c;旨在保护网络免受恶意攻击、数据泄露和网络犯罪的威胁&#xff0c;其核心包…