python 学习: 矩阵运算

摘要: 本贴通过例子描述 python 的矩阵运算.

1. 一般乘法 (mm 与 matmul)

代码:

    input_mat1 = torch.tensor([[1, 2, 3, 4],[1, 2, 2, 3]])input_mat2 = torch.tensor([[1, 2, 3, 3],[2, 1, 2, 3],[3, 1, 2, 2],[2, 3, 2, 3]])print("input_mat1: ", input_mat1)print("input_mat2: ", input_mat2)output_mat1 = torch.mm(input_mat1, input_mat2)print("torch.mm() test, output_mat1 = ", output_mat1)output_mat2 = torch.matmul(input_mat1, input_mat2)print("torch.matmul() test, output_mat2 = ", output_mat2)

结果:

input_mat1:  tensor([[1, 2, 3, 4],[1, 2, 2, 3]])
input_mat2:  tensor([[1, 2, 3, 3],[2, 1, 2, 3],[3, 1, 2, 2],[2, 3, 2, 3]])
torch.mm() test, output_mat1 =  tensor([[22, 19, 21, 27],[17, 15, 17, 22]])
torch.matmul() test, output_mat2 =  tensor([[22, 19, 21, 27],[17, 15, 17, 22]])

分析:

  • 利用 torch.tensor 来定义张量 (含矩阵);
  • torch.mm() 和 torch.matmul() 在这个例子里面的作用相同, 都是将 m × n m \times n m×n n × k n \times k n×k 的矩阵进行乘法, 获得 m × k m \times k m×k 的矩阵;
  • torch.matmul() 在 3 维及以上数据中有些奇怪的用法.

2. 逐点乘法 (乘法符号)

2.1 一维数组

代码:

    print("---torch.tensor star product test---")input_array1 = torch.tensor([1, 2, 3, 4])input_array2 = torch.tensor([4, 3, 2, 1])star_product = input_array1 * input_array2print("star_product: ", star_product)

结果:

---torch.tensor star product test---
star_product:  tensor([4, 6, 6, 4])

分析:

  • 不改变向量尺寸.

2.2 二维矩阵

代码:

    print("---element_wise_product  test---")input_matrix = np.array([[1, 2], [3, 4]])element_wise_product = input_matrix * input_matrixprint("element_wise_product : ", element_wise_product)

结果:

---element_wise_product  test---
element_wise_product :  [[ 1  4][ 9 16]]

分析:

  • 不改变矩阵尺寸.

3. 点乘 (dot)

3.1 一维数组

代码:

    print("---torch.tensor dot_product test---")input_array1 = torch.tensor([1, 2, 3, 4])input_array2 = torch.tensor([4, 3, 2, 1])dot_product = torch.dot(input_array1, input_array2)print("array dot_product: ", dot_product)print("---np.array dot_product test---")input_array1 = np.array([1, 2, 3, 4])input_array2 = np.array([4, 3, 2, 1])dot_product = np.dot(input_array1, input_array2)print("array dot_product: ", dot_product)

结果:

---torch.tensor dot_product test---
array dot_product:  tensor(20)
---np.array dot_product test---
array dot_product:  20

分析:

  • 相当于内积;
  • torch.tensor 和 np.array 都支持 dot;
  • torch 返回结果是一个 1 × 1 1 \times 1 1×1 tensor, np 返回的是一个标量.

3.2 矩阵

与 torch.matmul 相同.

4. 拼接 (cat)

cat 不改变数据性质 (向量/矩阵/张量仍然是向量/矩阵/张量)

4.1 向量

代码:

    print("---array test---")input_mat1 = torch.tensor([1, 2, 3, 4])print("input: ", input_mat1)horizontal_stack = torch.cat((input_mat1, input_mat1), 0)#vertical_stack = torch.cat((input_mat1, input_mat1), 1)print("horizontal_cat = ", horizontal_stack)#print("vertical_cat = ", vertical_stack)

结果:

---array test---
input:  tensor([1, 2, 3, 4])
horizontal_cat =  tensor([1, 2, 3, 4, 1, 2, 3, 4])

分析:

  • cat 的第 2 个参数指定方向, 0 表示水平, 1 表示垂直;
  • 向量支持水平叠加, 不支持垂直叠加, 否则向量变成二维矩阵, 不合适.

4.2 矩阵

代码:

    print("---matrix test---")input_mat1 = torch.tensor([[1, 2, 3, 4],[1, 2, 2, 3]])print("input: ", input_mat1)horizontal_cat = torch.cat((input_mat1, input_mat1), 0)vertical_cat = torch.cat((input_mat1, input_mat1), 1)print("horizontal_cat = ", horizontal_cat)print("vertical_cat = ", vertical_cat)print("shape: ", np.shape(input_mat1), np.shape(horizontal_cat), np.shape(vertical_cat))

结果:

---matrix test---
input:  tensor([[1, 2, 3, 4],[1, 2, 2, 3]])
horizontal_cat =  tensor([[1, 2, 3, 4],[1, 2, 2, 3],[1, 2, 3, 4],[1, 2, 2, 3]])
vertical_cat =  tensor([[1, 2, 3, 4, 1, 2, 3, 4],[1, 2, 2, 3, 1, 2, 2, 3]])
shape:  torch.Size([2, 4]) torch.Size([4, 4]) torch.Size([2, 8])       

分析:

  • 水平叠加两个 m × n m \times n m×n 矩阵, 将获得一个 2 m × n 2m \times n 2m×n 矩阵; 垂直叠加两个 m × n m \times n m×n 矩阵, 将获得一个 m × 2 n m \times 2n m×2n 矩阵.

4.3 张量

    print("---tensor test---")input_tensor1 = torch.tensor([[[1, 2, 3, 4], [1, 2, 2, 3]],[[5, 6, 7, 8], [8, 7, 6, 5]]])print("input: ", input_tensor1)horizontal_cat = torch.cat((input_tensor1, input_tensor1), 0)vertical_cat = torch.cat((input_tensor1, input_tensor1), 1)print("horizontal_cat = ", horizontal_cat)print("vertical_cat = ", vertical_cat)print("shape: ", np.shape(input_tensor1), np.shape(horizontal_cat), np.shape(vertical_cat))   

结果:

---tensor test---
input:  tensor([[[1, 2, 3, 4],[1, 2, 2, 3]],[[5, 6, 7, 8],[8, 7, 6, 5]]])
horizontal_cat =  tensor([[[1, 2, 3, 4],[1, 2, 2, 3]],[[5, 6, 7, 8],[8, 7, 6, 5]],[[1, 2, 3, 4],[1, 2, 2, 3]],[[5, 6, 7, 8],[8, 7, 6, 5]]])
vertical_cat =  tensor([[[1, 2, 3, 4],[1, 2, 2, 3],[1, 2, 3, 4],[1, 2, 2, 3]],[[5, 6, 7, 8],[8, 7, 6, 5],[5, 6, 7, 8],[8, 7, 6, 5]]])
shape:  torch.Size([2, 2, 4]) torch.Size([4, 2, 4]) torch.Size([2, 4, 4])

分析:

  • 水平叠加两个 m × n × k m \times n \times k m×n×k 张量, 将获得一个 2 m × n × k 2m \times n \times k 2m×n×k 张量; 垂直叠加两个 m × n m \times n m×n 矩阵, 将获得一个 m × 2 n × k m \times 2n \times k m×2n×k 矩阵.

5. 堆叠 (stack)

5.1 向量堆叠成矩阵

代码:

    print("---torch.tensor stack test---")input_array1 = torch.tensor([1, 2, 3, 4])input_array2 = torch.tensor([4, 3, 2, 1])array_stack_horizontal = np.stack([input_array1, input_array2], axis=0)print("horizontal stack: ", array_stack_horizontal)array_stack_vertical = np.stack([input_array1, input_array2], axis=1)print("vertical stack: ", array_stack_vertical)

结果:

---torch.tensor stack test---
horizontal stack:  [[1 2 3 4][4 3 2 1]]
vertical stack:  [[1 4][2 3][3 2][4 1]]

分析: k k k n n n 维向量堆叠, k × n k \times n k×n 维矩阵.

  • 如果按照 axis=0 来读取, 则对应于 ( y , x ) (y, x) (y,x) 坐标;
  • 如果按照 axis=1 来读取, 则对应于 ( x , y ) (x, y) (x,y) 坐标, 即获得 n × k n \times k n×k 维矩阵.

5.2 矩阵堆叠成张量

代码:

    print("---numpy stack test---")tensor1 = np.arange(1, 13).reshape((3, 4))tensor2 = np.arange(13, 25).reshape((3, 4))print("tensor1: ", tensor1)print("tensor2: ", tensor2)tensor_stack0 = np.stack([tensor1, tensor2], axis=0)print("\r\naxis 0 stack: ", tensor_stack0)print("shape: ", np.shape(tensor_stack0))tensor_stack1 = np.stack([tensor1, tensor2], axis=1)print("axis 1 stack: ", tensor_stack1)print("shape: ", np.shape(tensor_stack1))tensor_stack2 = np.stack([tensor1, tensor2], axis=2)print("axis 2 stack: ", tensor_stack2)print("shape: ", np.shape(tensor_stack2))

结果:

---numpy stack test---
tensor1:  [[ 1  2  3  4][ 5  6  7  8][ 9 10 11 12]]
tensor2:  [[13 14 15 16][17 18 19 20][21 22 23 24]]axis 0 stack:  [[[ 1  2  3  4][ 5  6  7  8][ 9 10 11 12]][[13 14 15 16][17 18 19 20][21 22 23 24]]]
shape:  (2, 3, 4)
axis 1 stack:  [[[ 1  2  3  4][13 14 15 16]][[ 5  6  7  8][17 18 19 20]][[ 9 10 11 12][21 22 23 24]]]
shape:  (3, 2, 4)
axis 2 stack:  [[[ 1 13][ 2 14][ 3 15][ 4 16]][[ 5 17][ 6 18][ 7 19][ 8 20]][[ 9 21][10 22][11 23][12 24]]]
shape:  (3, 4, 2)

分析: k k k m × n m \times n m×n 矩阵堆叠

  • 方向 0: k × m × n k \times m \times n k×m×n 张量;
  • 方向 1: m × k × n m \times k \times n m×k×n 张量;
  • 方向 2: m × n × k m \times n \times k m×n×k 张量.

进一步理解:
m × n m \times n m×n 矩阵在描述的时候, 可以用 ( x , y ) (x, y) (x,y) 坐标描述. 堆叠成 k × m × n k \times m \times n k×m×n 张量 (立方体), 可以用三种顺序描述: ( z , x , y ) (z, x, y) (z,x,y), ( x , z , y ) (x, z, y) (x,z,y), ( x , y , z ) (x, y, z) (x,y,z), 只要控制每个维度从小到大即可.

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

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

相关文章

Linux —— 信号初识

Linux —— 信号初识 什么是信号测试几个信号signal函数函数原型参数说明返回值注意事项示例 后台程序前台转后台检测输入中断向量表 我们今天来继续学习Linux的内容,今天我们要了解的是Linux操作系统中的信号: 什么是信号 信号是操作系统内核与进程之…

判断dll/lib是32/64位、查看lib是导入库/静态库的方法 、查看dll包含的符合、lib包含的函数

一、判断dll/lib是32/64位 原文链接:https://www.cnblogs.com/bandaoyu/p/16752602.html 1. 简便方法: 直接用记事本或者notepad(或txt文本)打开exe文件(dll文件),会有很多乱码,不要头疼,接下…

Vitis HLS 学习笔记--Schedule Viewer 调度查看器

目录 1. 简介 2. Schedule Viewer详解 2.1 视图说明 2.1.1 Operation\Control Step 2.1.2 周期关系图 2.1.3 Schedule Viewer 菜单栏 2.1.4 属性视图 2.2 内容说明 2.2.1 实参(b)解释 2.2.2 实参(a)解释 2.2.3 变量&am…

Microsoft 推出 Phi-3 系列紧凑型语言模型

本心、输入输出、结果 文章目录 Microsoft 推出 Phi-3 系列紧凑型语言模型前言Phi-3 基础参数模型对比突破性训练技术降低人工智能安全风险Microsoft 推出 Phi-3 系列紧凑型语言模型 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_15071263 如果觉得本文对你…

【PyTorch与深度学习】3、PyTorch张量的运算API(下)

课程地址 最近做实验发现自己还是基础框架上掌握得不好,于是开始重学一遍PyTorch框架,这个是课程笔记,这个课还是讲的简略,我半小时的课听了一个半小时。 1. PyTorch的数据类型 数据类型dtype参数遗留的构造函数32位浮点数torch…

WPS二次开发系列:如何使用WPS返回的FileUri

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 目录 什么是FileUri 在SDK中的使用场景 打开文档时…

Windows如何安装hadoop

Hadoop是一个开源的分布式计算平台,旨在处理大规模数据的存储和处理。它提供了分布式文件系统(HDFS)和分布式计算框架(MapReduce),使得用户能够在大规模集群上存储和处理数据。Hadoop最初由Apache软件基金会…

15、Python:循环控制语句

在编程中,循环控制语句是实现代码重复执行的基本结构。Python 提供了多种循环控制结构,以适应不同的编程场景。本文将详细介绍 Python 中的 for 循环和 while 循环,以及如何使用 break 和 continue 语句来控制循环流程。 for 循环 for 循环…

spring boot test 设置环境变量

在 Spring Boot 中,可以通过在测试类上添加 TestPropertySource 注解来设置测试环境变量。该注解可以指定一个或多个 properties 文件,或者一个或多个 key-value 形式的环境变量。 例如,如果您有一个名为 application-test.properties 的测试…

cmake进阶:定义函数的使用方法

一. 简介 前面已经将 cmake 中常用的命令 command、变量 variable 都给大家进行了详细介绍,通过前面的学习,相信大家已经掌握了 cmake 工具的基本使用方法; 接下来我们再进一步学习 cmake,本文开始学习 cmake中定义函数。 二. …

TypeScript学习日志-第十九天(namespace命名空间)

namespace命名空间 一、基本用法 namespace 所有的变量以及方法必须要导出才能访问,如图: 二、 嵌套 namespace 可以进行嵌套使用,如图: 它也必须需要导出才能访问 三、合并 当我们出现两个同名的 namespace 它就会合并这两…

EFDC模型安装及建模方法;在排污口论证、水质模拟、地表水环评、地表水水源地划分、水环境容量计算等领域中的应用

目录 专题一 EFDC软件安装 专题二 EFDC模型讲解 专题三 一维河流模拟实操 专题四 建模前处理 专题五 EFDC网格剖分介绍 专题六 EFDC二维湖库水动力模拟/非保守染色剂模拟 专题七 EFDC水质模型参数及原理介绍 专题八 EFDC一、二、三维湖库水质模拟 专题九 基于EFDC的地…

nodejs的ws+vue3编写聊天室的demo

nodejs编写ws服务是非常简单高效的,nodejs有众多的实现ws的库,如ws,SocketIO等,nodejs的事件线程是单线程的,所以不要在事件线程内做阻塞性的操作,耗时的操作交给工作线程或者子进程操作。 我使用nodejsvue3实现了写了…

408数据结构-二叉树的遍历 自学知识点整理

前置知识:二叉树的概念、性质与存储结构 二叉树的遍历 二叉树的遍历是指按某条搜索路径访问树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。 二叉树的递归特性: ①要么是棵空二叉树; ②要么就是由“根节点左子树右子树…

【NOI】C++程序结构入门之分支结构二

文章目录 前言一、逻辑运算符1.导入2.逻辑与(&&)3.逻辑或(||)4.逻辑非(!) 二、例题讲解问题:1656. 是两位的偶数吗问题:1658. 游乐设施问题:1659. 是否含有数字5…

Linux下的Git指令操作

1.安装git sudo apt-get install git 2.本地拉取已有仓库项目(红色部分请替换) git clone https://github.com/test/test.git 3. 上传本地新增内容(文本或文件夹) git add XXX 4.添加新增内容说明 git commit -m XXXX 5. 将本地仓库同步修改到远程仓库 …

AI绘画:Stable Diffusion 拒绝一眼塑料味的AI质感,超写实人物图片如何制作?简单几步教会你!

今天给大家介绍一款能够对生成的人像进行皮肤调节的 lora。 上面两幅图片的生成参数一样,尺寸也一样,但右边一幅图片相较于左面图片的画面质感,特别是人像皮肤的质感上有很大的提升,看上去更加细腻有层感。 这就是我们今天要介绍…

条款5:对定制的“类型转换函数”保持警觉

C允许编译器在不同类型之间执行隐式转换(implicit conversions)。 继承了C的伟大传统,这个语言允许默默地将char转换为 int,将 short 转换为 doublea这便是为什么你可以将一个short 交给一个“期望获得double”的函数而仍能成功的…

linux下的调试工具gdb的详细使用介绍

在之前学习中我们使用的通常是集各种功能于一体的编译器,例如VS stdio,但是一个程序在编辑后还要进行编译,然后才能产生一个二进制的可执行文件,编辑和翻译工作都可以使用不同的软件进行,例如记事本就是一款编辑软件&a…

03.配置监控一台服务器主机

配置监控一台服务器主机 安装zabbix-agent rpm -ivh https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.11-1.el7.x86_64.rpm配置zabbix-agent,配置的IP地址是zabbix-server的地址,因为要监控这台主机 vim /etc/zabbix/zab…