当前位置: 首页 > news >正文

【不写for循环】玩玩行列

利用numpy的并行操作可以比纯用Python的list快很多,不仅如此,代码往往精简得多。

So, 这篇来讲讲进阶的广播和花哨索引操作,少写几个for循环()。

目录

一个二维的例题

一个三维的例题

解法一

解法二

更难的三维例题

解法一

解法二

独热编码

写法一

写法二

一个二维的例题

从一个简单的问题开始,现在有一个向量:

x = \left ( a,b,c \right )

弄出这个东西出来:

\begin{pmatrix} a+a &a+b &a+c \\ b+a & b+b &b+c \\ c+a&c+b &c+c \end{pmatrix}

这个很简单:

x = [1, 2, 3]
res = []
for i in x:for j in x:res.append(i + j)
res = torch.tensor(res).reshape(3, 3)
res# output
tensor([[2, 3, 4],[3, 4, 5],[4, 5, 6]])

以上内容是开玩笑的,下面开始认真起来。自然,这个很明显是个广播的送分题:

x = torch.tensor([1, 2, 3])
x + x.reshape(-1, 1)#output
tensor([[2, 3, 4],[3, 4, 5],[4, 5, 6]])

一个三维的例题

现在有一个向量:

x =\begin{pmatrix} a\\ b\\ c \end{pmatrix}

弄出这个东西出来:

\begin{pmatrix} a+a &a+b &a+c \\ b+a & b+b &b+c \\ c+a&c+b &c+c \end{pmatrix}

不过现在a b c都是长度为4的向量。x是一个(3, 4)的矩阵(还是说明一下,这里不表示分块矩阵),目标是一个(3, 3, 4)的张量。

解法一

这个在GAT里面里面很常见(把“+”换成“concat”就是图卷积注意力的核心步骤之一)。当时看了一大圈的zhihu和CSDN,都是这么写的:

先x.repeat(1,3),横着重复,维度是(3, 3*4):

(||表示两个向量拼接)

x_{1} = \begin{pmatrix} a||a||a\\ b||b||b\\ c||c||c \end{pmatrix}

然后x.reshape(3*3, -1), 维度变成(3*3, 4):

x_{1} = \begin{pmatrix} a\\ a\\ a\\ b\\ b\\ b\\ c\\ c\\ c \end{pmatrix}

另一个竖着重复,x.repeat(3,1),维度是(3*3, 4):

x_{2} = \begin{pmatrix} a\\ b\\ c\\ a\\ b\\ c\\ a\\ b\\ c \end{pmatrix}

然后相加reshape即可。

x = torch.tensor([[1, 1, 1, 1],[2, 2, 2, 2],[3, 3, 3, 3]])
(x.repeat(1, 3).reshape(3*3, 4) + x.repeat(3, 1)).reshape(3, 3, 4)#output
tensor([[[2, 2, 2, 2],[3, 3, 3, 3],[4, 4, 4, 4]],[[3, 3, 3, 3],[4, 4, 4, 4],[5, 5, 5, 5]],[[4, 4, 4, 4],[5, 5, 5, 5],[6, 6, 6, 6]]])

解法二

后来想了一下其实可以直接广播。

解法一虽然复杂一点,但是把题目里面的“+”改成“||”就只能用解法一了。

x = torch.tensor([[1, 1, 1, 1],[2, 2, 2, 2],[3, 3, 3, 3]])
x.unsqueeze(0) + x.unsqueeze(1)  # (1, 3, 4) + (3, 1, 4)#output
tensor([[[2, 2, 2, 2],[3, 3, 3, 3],[4, 4, 4, 4]],[[3, 3, 3, 3],[4, 4, 4, 4],[5, 5, 5, 5]],[[4, 4, 4, 4],[5, 5, 5, 5],[6, 6, 6, 6]]])

更难的三维例题

现在有一个向量:

x =\begin{pmatrix} a\\ b\\ c \end{pmatrix}

弄出这个东西出来:

\begin{pmatrix} a\cdot a &a\cdot b &a\cdot c \\ b\cdot a & b\cdot b &b\cdot c \\ c\cdot c&c\cdot b &c\cdot c \end{pmatrix}

不过现在a b c都是长度为4的向量。x是一个(3, 4)的矩阵(还是说明一下,这里不表示分块矩阵),两两做点积,目标是一个(3, 3)的张量。

先来一个错误示例:

x = torch.tensor([[1, 1, 1, 1],[2, 2, 2, 2],[3, 3, 3, 3]])
np.dot(x.unsqueeze(0), x.unsqueeze(1)), torch.dot(x.unsqueeze(0), x.unsqueeze(1))

两种做法都是错的,torch.dot只支持1D的向量。np,dot处理高维度的张量的逻辑很不同,这里可以

查阅资料,不细说了。

解法一

可以用numpy里面最玄学的函数之一——np.meshgrid

先看看这个函数是干嘛的:

x = torch.tensor([[1, 1, 1, 1],[2, 2, 2, 2],[3, 3, 3, 3]])
i, j = np.meshgrid(np.arange(x.shape[0]), np.arange(x.shape[1]), indexing='ij')
i, j# output
array([[0, 0, 0, 0],[1, 1, 1, 1],[2, 2, 2, 2]]array([[0, 1, 2, 3],[0, 1, 2, 3],[0, 1, 2, 3]])

np.arange(x.shape[0]) : array([0, 1, 2])

np.arange(x.shape[0]) : array([0, 1, 2, 3])

然后这个函数让前者往右重复,让后者往下重复,得到两个矩阵。然后细心看花哨索引和广播就知道:

x == x[i, j]  !!!

了解这个函数干嘛后,那下面我们进入正题。

x = torch.tensor([[1, 1, 1, 1],[2, 2, 2, 2],[3, 3, 3, 3]])
x1, x2 = x.unsqueeze(0), x.unsqueeze(1)  # (1, 3, 4) (3, 1, 4)
x1, x2 = torch.broadcast_tensors(x1, x2)  # (3, 3, 4) (3, 3, 4) 手动广播
i, j = np.meshgrid(np.arange(3), np.arange(3), indexing='ij')
torch.sum(x1[i, j, :] * x2[i, j, :], dim=-1)#output
tensor([[ 4,  8, 12],[ 8, 16, 24],[12, 24, 36]])

用花哨索引固定前两个维度不动,在第三个维度上相乘求和(就是点积)。搞定。

解法二

x = torch.tensor([[1, 1, 1, 1],[2, 2, 2, 2],[3, 3, 3, 3]])
x1, x2 = x.unsqueeze(0), x.unsqueeze(1)  # (1, 3, 4) (3, 1, 4)
torch.einsum('ijk,ijk->ij', x1, x2)  # 这个函数支持广播#output
tensor([[ 4,  8, 12],[ 8, 16, 24],[12, 24, 36]])

np.einsum的全称是Einstein summation convention,即爱因斯坦求和约定。这个约定允许我们通过一个简洁的字符串表达式来指定复杂的数组运算,包括点积、矩阵乘法、张量收缩等。

这里是一个简单的运用。

独热编码

原来利用广播可以写独热编码。

写法一

一般独热编码可以这么写

a = np.array([1, 2, 1, 0])
category = len(np.unique(a))
eye = np.eye(category)
eye, eye[a]#output
array([[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]]array([[0., 1., 0.],[0., 0., 1.],[0., 1., 0.],[1., 0., 0.]]

eye是一个单位矩阵,a构成了一个花哨索引,每次取eye的一行,然后取4次。

十分简洁。缺点是a的每个值必须在[0,category-1]中。

写法二

a = np.array(['a', 'b', 'c', 'd', 'e', 'f'])
b = np.array(['d', 'e', 'f'])
b = b.reshape(-1, 1)  # (3, 1)
(a == b).astype(int)# output
array([[0, 0, 0, 1, 0, 0],[0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 0, 1]]

支持各种类型的数据,而且还能应对b的某个元素不在a中的尴尬情况(此时一排都是0,因为一排都是不等于)。

有一个缺点是,在第四行时,Pycharm不知道这是一个a==b是一个布尔数组,在"astype"会画一个黄色,看着闹心(狗头)。

相关文章:

【不写for循环】玩玩行列

利用numpy的并行操作可以比纯用Python的list快很多,不仅如此,代码往往精简得多。 So, 这篇来讲讲进阶的广播和花哨索引操作,少写几个for循环()。 目录 一个二维的例题 一个三维的例题 解法一 解法二 更难的三维例题…...

【Nginx】反向代理Https时相关参数:

在Nginx代理后台HTTPS服务时,有几个关键的参数需要配置,以确保代理服务器能够正确地与后端服务器进行通信。一些重要参数的介绍: proxy_ssl_server_name:这个参数用于指定是否在TLS握手时通过SNI(Server Name Indicati…...

第 17 章 - Go语言 上下文( Context )

在Go语言中,context包为跨API和进程边界传播截止时间、取消信号和其他请求范围值提供了一种方式。它主要应用于网络服务器和长时间运行的后台任务中,用于控制一组goroutine的生命周期。下面我们将详细介绍context的定义、使用场景、取消和超时机制&#…...

Android Framework AMS(16)进程管理

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…...

STM32设计防丢防摔智能行李箱

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展,嵌入式系统、物联网技术、智能设备…...

【异常解决】Linux shell报错:-bash: [: ==: 期待一元表达式 解决方法

博主介绍:✌全网粉丝21W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

ML 系列: 第 23 节 — 离散概率分布 (多项式分布)

目录 一、说明 二、多项式分布公式 2.1 多项式分布的解释 2.2 示例 2.3 特殊情况:二项分布 2.4 期望值 (Mean) 2.5 方差 三、总结 3.1 python示例 一、说明 伯努利分布对这样一种情况进行建模:随机变量可以采用两个可能的值&#…...

Webpack 1.13.2 执行 shell 命令解决 打印时没有背景色和文字颜色的问题

这是因为 Webpack 1.13.2 不支持新的插件钩子 API。Webpack 1 的插件系统使用的是 plugin 方法,而不是 Webpack 4 中的 hooks。 在 Webpack 1 中,你可以使用以下代码来确保 sed 命令在打包完成后执行: const { exec } require(child_proce…...

C++构造函数详解

构造函数详解:C 中对象初始化与构造函数的使用 在 C 中,构造函数是一种特殊的成员函数,它在创建对象时自动调用,用来初始化对象的状态。构造函数帮助我们确保每个对象在被创建时就处于一个有效的状态,并且在不传递任何…...

POI实现根据PPTX模板渲染PPT

目录 1、前言 2、了解pptx文件结构 3、POI组件 3.1、引入依赖 3.2、常见的类 3.3、实现原理 3.4、关键代码片段 3.4.1、获取ppt实例 3.4.2、获取每页幻灯片 3.4.3、循环遍历幻灯片处理 3.4.3.1、文本 3.4.3.2、饼图 3.4.3.3、柱状图 3.4.3.4、表格 3.4.3.5、本地…...

【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看

文献:蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930. 本文目录 一、前言二、文献阅读-基于深度学习的复杂储层流体性质测井识别2.1 摘要2.2 当前研究不足2.3 本文创新2.4 论文…...

树的直径计算:算法详解与实现

树的直径计算:算法详解与实现 1. 引言2. 算法概述3. 伪代码实现4. C语言实现5. 算法分析6. 结论在图论中,树的直径是一个关键概念,它表示树中任意两点间最长路径的长度。对于给定的树T=(V,E),其中V是顶点集,E是边集,树的直径定义为所有顶点对(u,v)之间最短路径的最大值。…...

conda创建 、查看、 激活、删除 python 虚拟环境

1、创建 python 虚拟环境 ,假设该环境命名为 “name”。 conda create -n name python3.11 2、查看 python 虚拟环境。 conda info -e 3、激活使用 python 虚拟环境。 conda activate name 4、删除 python 虚拟环境 conda remove -n name --all ​​ 助力快速掌握数据集…...

vs2022搭建opencv开发环境

1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器,将OpenCV中lib库里的o…...

NVIDIA NIM 开发者指南:入门

NVIDIA NIM 开发者指南:入门 NVIDIA 开发者计划 想要了解有关 NIM 的更多信息?加入 NVIDIA 开发者计划,即可免费访问任何基础设施云、数据中心或个人工作站上最多 16 个 GPU 上的自托管 NVIDIA NIM 和微服务。 加入免费的 NVIDIA 开发者计…...

探索Python网络请求新纪元:httpx库的崛起

文章目录 **探索Python网络请求新纪元:httpx库的崛起**第一部分:背景介绍第二部分:httpx库是什么?第三部分:如何安装httpx库?第四部分:简单的库函数使用方法1. 发送GET请求2. 发送POST请求3. 超…...

学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着

ArcGIS水文分析实战教程(7)细说流域提取_汇流域栅格-CSDN博客 ArcGIS水文分析实战教程(6)河流提取与河网分级_arcgis的dem河流分级-CSDN博客 ArcGIS水文分析实战教程(5)细说流向与流量-CSDN博客 ArcGIS …...

QQ 小程序已发布,但无法被搜索的解决方案

前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过,上架后却一直无法被搜索到。打开后,再在 QQ 上下拉查看 “最近使用”,发现他出现一下又马上消失。 上线是按正常流程走的,开发、备案、审核,没有任何违规&#xf…...

【C++】拷贝构造 和 赋值运算符重载

目录: 一、拷贝构造 (一)拷贝函数的特点 二、赋值运算符重载 (一)运算符重载 (二)赋值运算符重载 正文 一、拷贝构造 如果一个构造函数的第一个参数是自身类类型的引用,且任何…...

21.UE5游戏存档,读档,函数库

2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档: 3.加载游戏,保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂,中间没有运行程序进行阶段性成果的验…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色&#xf…...

如何在网页里填写 PDF 表格?

有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据&#xff…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦&#xff0…...