函数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}[91​52​92​]
我们运行下代码,看下是不是这样:

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}[91​50​22​74​]
这个矩阵的主对角线元素为[9, 0]

第2个:
[75294210]\begin{bmatrix} 7& 5& 2&9 \\ 4& 2& 1&0 \end{bmatrix}[74​52​21​90​]
这个矩阵的主对角线元素为[7, 2]

第3个:
[52970421]\begin{bmatrix} 5& 2& 9&7 \\ 0& 4& 2&1 \end{bmatrix}[50​24​92​71​]
这个矩阵的主对角线元素为[5, 4]

有同学要问:为什么不是下面这个顺序?
第1个:
[52970421]\begin{bmatrix} 5& 2& 9&7 \\ 0& 4& 2&1 \end{bmatrix}[50​24​92​71​]
这个矩阵的主对角线元素为[5, 4]

第2个:
[75294210]\begin{bmatrix} 7& 5& 2&9 \\ 4& 2& 1&0 \end{bmatrix}[74​52​21​90​]
这个矩阵的主对角线元素为[7, 2]

第3个:
[95271024]\begin{bmatrix} 9& 5& 2&7 \\ 1& 0& 2&4 \end{bmatrix}[91​50​22​74​]
这个矩阵的主对角线元素为[9, 0]

问得好,原因是实际上是把行维度索引(axis1)从0到2取值形成的三个二维矩阵,
当行维度为索引为0时,实际上是把所有的第0行取出形成一个二维矩阵;
当行维度为索引为1时,实际上是把所有的第1行取出形成一个二维矩阵;
当行维度为索引为2时,实际上是把所有的第2行取出形成一个二维矩阵;
所以这三个矩阵是有顺序的。

所以最终形成的对角线数组为:
[907254]\begin{bmatrix} 9&0 \\ 7&2 \\ 5&4 \end{bmatrix}⎣⎡​975​024​⎦⎤​

我们看一下是不是我们上面分析的结果:

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()的区别】相关推荐

  1. pillow属于python标准库吗_详解Python图像处理库Pillow常用使用方法

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. 其官方主页为:PIL. PIL ...

  2. python二维元素向量_详解python Numpy中求向量和矩阵的范数

    在python Numpy中求向量和矩阵的范数实例 np.linalg.norm(求范数):linalg=linear(线性)+algebra(代数),norm则表示范数. 函数参数 x_norm=n ...

  3. python random库安装,详解python第三方库的安装、PyInstaller库、random库

    python第三方库的安装 PyInstaller库 PyInstaller库能够在不同操作系统下将python源文件打包,变成直接可运行的可执行文件. 可以通过-F参数对python源文件生成一个独 ...

  4. pillow是python的图像处理标准库_详解Python图像处理库Pillow常用使用方法

    pil(python image library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. 其官方主页为:pil. pil ...

  5. 详解Python第三方库(三)----- Pillow库

    一.简介及安装Pillow 1.1 简介 PIL:Python Imaging Library,已经是Python平台上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用,因此广受开发人员 ...

  6. 详解Python第三方库(一)-----tqdm库

    简介 显示循环的进度条的库.taqadum在阿拉伯语中的意思是进展.tqdm可以在长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator),是一个快速.扩展性强的进度条工 ...

  7. 用于生成随机数的python标准库模块是_详解Python基础random模块随机数的生成

    详解Python基础random模块随机数的生成 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  详解Python基础random模块随机数的生成.txt ] ( ...

  8. 【可解释性机器学习】详解Python的可解释机器学习库:SHAP

    详解Python的可解释机器学习库:SHAP SHAP介绍 SHAP的用途 SHAP的工作原理 解释器Explainer 局部可解释性Local Interper 单个prediction的解释 多个 ...

  9. 详解Python中pyautogui库的最全使用方法

    这篇文章主要介绍了详解Python中pyautogui库的最全使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值 在使用Python做脚本的话,有两个库可以使用,一个 ...

  10. python 减法函数_详解 Python 的二元算术运算,为什么说减法只是语法糖?

    大家对我解读属性访问的博客文章反应热烈,这启发了我再写一篇关于 Python 有多少语法实际上只是语法糖的文章.在本文中,我想谈谈二元算术运算. 具体来说,我想解读减法的工作原理:a - b.我故意选 ...

最新文章

  1. 商汤作价1026亿IPO,商业化汤教授身家220亿
  2. SAP SD-销售模式-寄售(客户寄售)
  3. 科大星云诗社动态20210212
  4. 第三方控件DevExpress的TreeList绑定XML文件
  5. 2021高考襄阳四中成绩查询,襄阳四中2020年高考成绩怎么样(高考喜报)
  6. 力扣268.丢失的数字
  7. dao层如何调用对象_如何实现DBCP数据库连接池工具类&mvc分层开发web流程操作?...
  8. python实现模拟登录云课堂智慧职教并获取课程信息(1)
  9. 火焰识别python_OpenCV_火焰检测——完整代码
  10. 计算机频率原理,频率计数器的工作原理和发展
  11. 喜欢是可以培养的,学习也是
  12. 请问一下Android Studio如何配置JAVACV 0.8Javacv+2.4.9Opencv 万分感谢
  13. 前端 Switch 开关功能
  14. Linux修改和恢复服务器时间
  15. 蓝桥杯实验4--按键之独立键盘(proteus仿真)
  16. 我的世界服务器背景音乐修改,我的世界怎么自定义背景音乐教程攻略
  17. 把MySQL语句转换为sqlserver_mysql语句转换为sql server语句
  18. 0基础快速入门C语言单片机编程
  19. 使用开源软件替换现有的盗版软件
  20. 洛谷P1304哥德巴赫猜想 题解

热门文章

  1. 痞子衡嵌入式:ARM Cortex-M开发文件详解(3)- 工程文件(.ewp)
  2. javascript数组 去重
  3. (Java零基础学习笔记)第二章 Java中的基本语法
  4. Nyist 915 +-字符串
  5. 用余下的青春尽力飞翔
  6. 【洛谷P2947】向右看齐
  7. x11制作显示窗口图片
  8. 如何在Qt中使用数据库Sqlite保存和提取图片
  9. 完全卸载Office
  10. python字母转换视频_python将视频转换为全字符视频