详解Python-Numpy库的函数diagonal()【并附函数diagonal()与函数diag()的区别】
函数diagonal()用于返回数组(也可称为矩阵)的对角线元素。
在Numpy库中函数diag()也可用于返回数组的对角线元素,那么二者有什么区别呢?
我们先看二者的原型:
函数diag()的原型如下:
diag(v[, k])
函数diag()的原型如下:
diagonal(a[, offset, axis1, axis2])
diag()的参数k和diagonal()的参数offset的作用相同,都用于控制取哪根对角线的元素值(这里请联联想线性代数中的主对角线和副对角线的概念)。
这样,diagonal()就比diag()多了两个参数axis1, axis2,其功能就比diag()要强大些。那么其功能强大在哪里呢?
强大在于diagonal()可通过axis1, axis2去处理三维以上矩阵求对角线元素的问题。
所以函数diagonal()与函数diag()的区别就在于函数diagonal()能处理三维以上矩阵的对角线元素返回问题,而函数diag()只能处理二维以下矩阵上的对角线元素返回问题。
我们都知道只有二维矩阵才存在对角线,所以我们需要用两根轴去确定一个二维矩阵。axis1, axis2就是这个意思。
那么具体是怎么确定的呢?
以三维的矩阵为例,说明这个问题。
现有形状为(2,3,4)的三维矩阵A,,如下:
import numpy as npA = np.array([[[9, 5, 2, 7],[7, 5, 2, 9],[5, 2, 9, 7]],[[1, 0, 2, 4],[4, 2, 1, 0],[0, 4, 2, 1]]])
我们可在三维空间按照函数diagonal()对三条轴(axis)的定义画出它,如下图所示:
注意,这里三条轴的定义和我们通常认为的不一样,通常我们认为axis0代表列维度,axis1代表行维度,axis2代表第三维度。但在函数diagonal()看来,axis2代表列维度,axis1代表行维度,axis0代表第三维度。刚好和我们通常认为的相反。
另外,还要注意:上图中axis1的方向画反了,axis1的方向应该是向下才对。
显然,从上图可以看出,由轴axis2和axis1构成的二维平面包含两个二维矩阵。
第一个二维矩阵就是A[0],如下:
其主对角元素值为[9, 5 ,9]
第二个二维矩阵就是A[1],如下:
其主对角元素值为[1, 2, 2]。
所以返回的对角元素矩阵应该是如下这个样子的:
[959122]\begin{bmatrix} 9& 5&9 \\ 1& 2&2 \end{bmatrix}[915292]
我们运行下代码,看下是不是这样:
import numpy as npA = np.array([[[9, 5, 2, 7],[7, 5, 2, 9],[5, 2, 9, 7]],[[1, 0, 2, 4],[4, 2, 1, 0],[0, 4, 2, 1]]])diag1 = np.diagonal(A, 0, axis1=1, axis2=2)
运行结果如下:
果然和我们分析的一样。
为了进一步验证博主的分析,再看由axis0和axis2组成的二维空间。
还是看这幅图,显然由axis0和axis2组成的二维空间由以下三个二维矩阵组成(注意:上图中axis1的方向画反了,axis1的方向应该是向下才对。):
第1个:
[95271024]\begin{bmatrix} 9& 5& 2&7 \\ 1& 0& 2&4 \end{bmatrix}[91502274]
这个矩阵的主对角线元素为[9, 0]
第2个:
[75294210]\begin{bmatrix} 7& 5& 2&9 \\ 4& 2& 1&0 \end{bmatrix}[74522190]
这个矩阵的主对角线元素为[7, 2]
第3个:
[52970421]\begin{bmatrix} 5& 2& 9&7 \\ 0& 4& 2&1 \end{bmatrix}[50249271]
这个矩阵的主对角线元素为[5, 4]
有同学要问:为什么不是下面这个顺序?
第1个:
[52970421]\begin{bmatrix} 5& 2& 9&7 \\ 0& 4& 2&1 \end{bmatrix}[50249271]
这个矩阵的主对角线元素为[5, 4]
第2个:
[75294210]\begin{bmatrix} 7& 5& 2&9 \\ 4& 2& 1&0 \end{bmatrix}[74522190]
这个矩阵的主对角线元素为[7, 2]
第3个:
[95271024]\begin{bmatrix} 9& 5& 2&7 \\ 1& 0& 2&4 \end{bmatrix}[91502274]
这个矩阵的主对角线元素为[9, 0]
问得好,原因是实际上是把行维度索引(axis1)从0到2取值形成的三个二维矩阵,
当行维度为索引为0时,实际上是把所有的第0行取出形成一个二维矩阵;
当行维度为索引为1时,实际上是把所有的第1行取出形成一个二维矩阵;
当行维度为索引为2时,实际上是把所有的第2行取出形成一个二维矩阵;
所以这三个矩阵是有顺序的。
所以最终形成的对角线数组为:
[907254]\begin{bmatrix} 9&0 \\ 7&2 \\ 5&4 \end{bmatrix}⎣⎡975024⎦⎤
我们看一下是不是我们上面分析的结果:
import numpy as npA = np.array([[[9, 5, 2, 7],[7, 5, 2, 9],[5, 2, 9, 7]],[[1, 0, 2, 4],[4, 2, 1, 0],[0, 4, 2, 1]]])diag1 = np.diagonal(A, 0, axis1=0, axis2=2)
运行结果如下:
可见,果然和我们分析的一致。
详解Python-Numpy库的函数diagonal()【并附函数diagonal()与函数diag()的区别】相关推荐
- pillow属于python标准库吗_详解Python图像处理库Pillow常用使用方法
PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. 其官方主页为:PIL. PIL ...
- python二维元素向量_详解python Numpy中求向量和矩阵的范数
在python Numpy中求向量和矩阵的范数实例 np.linalg.norm(求范数):linalg=linear(线性)+algebra(代数),norm则表示范数. 函数参数 x_norm=n ...
- python random库安装,详解python第三方库的安装、PyInstaller库、random库
python第三方库的安装 PyInstaller库 PyInstaller库能够在不同操作系统下将python源文件打包,变成直接可运行的可执行文件. 可以通过-F参数对python源文件生成一个独 ...
- pillow是python的图像处理标准库_详解Python图像处理库Pillow常用使用方法
pil(python image library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. 其官方主页为:pil. pil ...
- 详解Python第三方库(三)----- Pillow库
一.简介及安装Pillow 1.1 简介 PIL:Python Imaging Library,已经是Python平台上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用,因此广受开发人员 ...
- 详解Python第三方库(一)-----tqdm库
简介 显示循环的进度条的库.taqadum在阿拉伯语中的意思是进展.tqdm可以在长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator),是一个快速.扩展性强的进度条工 ...
- 用于生成随机数的python标准库模块是_详解Python基础random模块随机数的生成
详解Python基础random模块随机数的生成 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: 详解Python基础random模块随机数的生成.txt ] ( ...
- 【可解释性机器学习】详解Python的可解释机器学习库:SHAP
详解Python的可解释机器学习库:SHAP SHAP介绍 SHAP的用途 SHAP的工作原理 解释器Explainer 局部可解释性Local Interper 单个prediction的解释 多个 ...
- 详解Python中pyautogui库的最全使用方法
这篇文章主要介绍了详解Python中pyautogui库的最全使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值 在使用Python做脚本的话,有两个库可以使用,一个 ...
- python 减法函数_详解 Python 的二元算术运算,为什么说减法只是语法糖?
大家对我解读属性访问的博客文章反应热烈,这启发了我再写一篇关于 Python 有多少语法实际上只是语法糖的文章.在本文中,我想谈谈二元算术运算. 具体来说,我想解读减法的工作原理:a - b.我故意选 ...
最新文章
- 商汤作价1026亿IPO,商业化汤教授身家220亿
- SAP SD-销售模式-寄售(客户寄售)
- 科大星云诗社动态20210212
- 第三方控件DevExpress的TreeList绑定XML文件
- 2021高考襄阳四中成绩查询,襄阳四中2020年高考成绩怎么样(高考喜报)
- 力扣268.丢失的数字
- dao层如何调用对象_如何实现DBCP数据库连接池工具类&mvc分层开发web流程操作?...
- python实现模拟登录云课堂智慧职教并获取课程信息(1)
- 火焰识别python_OpenCV_火焰检测——完整代码
- 计算机频率原理,频率计数器的工作原理和发展
- 喜欢是可以培养的,学习也是
- 请问一下Android Studio如何配置JAVACV 0.8Javacv+2.4.9Opencv 万分感谢
- 前端 Switch 开关功能
- Linux修改和恢复服务器时间
- 蓝桥杯实验4--按键之独立键盘(proteus仿真)
- 我的世界服务器背景音乐修改,我的世界怎么自定义背景音乐教程攻略
- 把MySQL语句转换为sqlserver_mysql语句转换为sql server语句
- 0基础快速入门C语言单片机编程
- 使用开源软件替换现有的盗版软件
- 洛谷P1304哥德巴赫猜想 题解