文章目录

  • 1. 矩阵对象
  • 2. 创建矩阵
  • 3. 矩阵属性
  • 4. 矩阵乘法

1. 矩阵对象

在数学上,矩阵(Matrix)是一个按照矩形阵列排列的复数或实数集合,但在NumPy中,矩阵np.matrix是数组np.ndarray的派生类。这意味着矩阵本质上是一个数组,拥有数组的所有属性和方法;同时,矩阵又有一些不同于数组的特性和方法。

  • 首先,矩阵是二维的,不能像数组一样幻化成任意维度,即使展开或切片,返回也是二维的;
  • 其次,矩阵和矩阵、矩阵和数组都可以做加减乘除运算,运算结果总是返回矩阵;
  • 最后,矩阵的乘法不同于数组乘法。

2. 创建矩阵

np.mat() 函数用于创建矩阵,它可以接受列表、数组甚至是字符串等形式的参数,还可以使用dtype参数指定数据类型,其代码如下。

>>> import numpy as np
>>> np.mat([[1,2,3],[4,5,6]], dtype=np.int32) # 使用列表创建矩阵
matrix([[1, 2, 3],[4, 5, 6]])
>>> np.mat(np.arange(6).reshape((2,3))) # 使用数组创建矩阵
matrix([[0, 1, 2],[3, 4, 5]])
>>> np.mat('1 4 7; 2 5 8; 3 6 9') # 使用Matlab风格的字符串创建矩阵
matrix([[1, 4, 7],[2, 5, 8],[3, 6, 9]])

此外,和生成特殊值数组类似,numpy.matlib 子模块()也提供了多个函数用于生成特殊值矩阵和随机数矩阵,其代码如下。

>>> import numpy.matlib as mat # 也可以不用单独导入,直接使用numpy.matlib.mat
>>> print(mat.zeros((2,3))) # 全0矩阵
[[0. 0. 0.][0. 0. 0.]]
>>> print(mat.ones((2,3))) # 全1矩阵
[[1. 1. 1.][1. 1. 1.]]
>>> print(mat.eye(3)) # 单位矩阵
[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]
>>> print(mat.empty((2,3))) # 空矩阵
[[1. 1. 1.][1. 1. 1.]]
>>> print(mat.rand((2,3))) # [0,1)区间随机数矩阵
[[0.505 0.494 0.96 ][0.681 0.002 0.281]]
>>> print(mat.randn((2,3))) # 均值0方差1的高斯(正态)分布矩阵
[[ 1.984  2.452  0.567][ 0.646 -0.909  0.774]]

3. 矩阵属性

矩阵有几个特有的属性,如转置矩阵、逆矩阵、共轭矩阵、共轭转置矩阵等。熟悉这些属性对矩阵计算会有很大的帮助。

>>> m = np.mat(np.arange(6).reshape((2,3)))
>>> print(m)
[[0 1 2][3 4 5]]
>>> print(m.T) # 返回自身的转置矩阵
[[0 3][1 4][2 5]]
>>> print(m.H) # 返回自身的共轭转置矩阵
[[0 3][1 4][2 5]]
>>> print(m.I) # 返回自身的逆矩阵
[[-0.778  0.278][-0.111  0.111][ 0.556 -0.056]]
>>> print(m.A) # 返回自身数据的视图(ndarray类)
[[0 1 2][3 4 5]]

4. 矩阵乘法

矩阵运算和数组运算大致相同,只有乘法运算有较大差别。在讲广播和矢量化时,我们已经知道,两个数组相乘就是对应元素相乘,条件是两个数组的结构相同。事实上,即使两个数组的结构不同,只要满足特定条件,也能做乘法运算。

除了对应元素相乘,数组还可以使用 np.dot() 函数相乘,其代码如下。

对于数组而言,使用星号相乘和使用np.dot()函数相乘是完全不同的两种乘法;对于矩阵来说,不管是使用星号相乘还是使用np.dot()函数相乘,结果都是np.dot( )函数相乘的结果,因为矩阵没有对应元素相乘这个概念。np.dot()函数实现的乘法就是矩阵乘法。那么矩阵乘法究竟是怎么运算的呢?下图是矩阵相乘的具体算法示意图。

不是所有的矩阵都能相乘。我们来看,矩阵A乘以矩阵B,二者可以相乘的条件是:A的列数必须等于B的行数。比如,a是4行2列,b是2行3列,axb,4223,没问题,但是反过来,bxa,2342,就无法运算了。可见,矩阵乘法,不满足交换律。再来看看乘法规则。概括说,就是A的各行逐一去乘B的各列。比如,A的第1行和b的第2列,元素个数一定相等,对应元素相乘后求和,作为结果矩阵第1行第2列的值。再比如,a的第3行和b的第3列,对应元素相乘后求和,作为结果矩阵第3行第3列的值。以此类推,我们就得到了矩阵A乘以矩阵B的结果矩阵。

那么,这个眼花缭乱的矩阵乘法,有什么实用价值吗?答案是:有,不但有,而且有非常大的使用价值。对于程序员来说,矩阵乘法最常见的应用是图像的旋转、位移、透视等操作。下面,我们来推导一个平面直角坐标系的旋转矩阵。

下面,我们应用这个推导结果,定义一个函数,返回平面上的点围绕原点旋转给定角度后的坐标:

>>> def rotate(p,d):a = np.radians(d)m = np.array([[np.cos(a), np.sin(a)],[-np.sin(a), np.cos(a)]])return np.dot(np.array(p), m)>>> rotate((5.7,2.8), 35) # 旋转35°
array([3.06315263, 5.56301141])
>>> rotate((5.7,2.8), 90) # 旋转90°
array([-2.8,  5.7])
>>> rotate((5.7,2.8), 180) # 旋转180°
array([-5.7, -2.8])
>>> rotate((5.7,2.8), 360) # 旋转360°
array([5.7, 2.8])

关于矩阵及其乘法,我们就讨论这么多。难度应该不大,但对于有数学恐惧症的程序员来说,会感到紧张。没关系,只要记住旋转矩阵的使用方法,即使不懂数学,也照样可以成为优秀的 Python程序员。

科学计算基础软件包NumPy入门讲座(7):矩阵相关推荐

  1. 科学计算基础软件包NumPy入门讲座(5):常用函数

    文章目录 1. 特殊值 2. 函数命名空间 3. 数学函数 4. 统计函数 5. 插值函数 6. 多项式拟合函数 7. 自定义广播函数 7.1.使用np.frompyfunc定义广播函数 7.2 使用 ...

  2. 科学计算基础软件包NumPy入门讲座(4):操作数组

    文章目录 1. 索引和切片 2. 改变结构 3. 合并与拆分 4. 复制 5. 排序 6. 查找和筛选 6.1 查找 6.2 筛选 7. 数组I/O 1. 索引和切片 NumPy数组对象的内容可以通过 ...

  3. 科学计算基础软件包Numpy学习 02

    创建数组 以下介绍Numpy创建数组的一些常用方法,主要有:蛮力构造法,特殊数值法,随机数值法,定长分割法,重复构造法,网络构造法,自定义数据类型 蛮力构造法 蛮力构造法使用np.array()函数来 ...

  4. python 科学计算基础教程电子版-自学Python 编程基础、科学计算及数据分析

    自学Python 编程基础.科学计算及数据分析 epub pdf mobi txt 下载 自学Python 编程基础.科学计算及数据分析 epub pdf mobi txt 下载 ☆☆☆☆☆ 李金 著 ...

  5. 【Python基础】科学计算库Scipy简易入门

    0.导语 Scipy是一个用于数学.科学.工程领域的常用软件包,可以处理插值.积分.优化.图像处理.常微分方程数值解的求解.信号处理等问题.它用于有效计算Numpy矩阵,使Numpy和Scipy协同工 ...

  6. 初识人工智能(一):数据分析(二):numpy科学计算基础库(一)

    1. numpy科学计算基础库 1.1 什么是numpy NumPy(Numerical Python)是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数 ...

  7. python科学计算基础教程pdf下载-Python科学计算基础教程_PDF电子书

    因资源下载地址容易失效,请加微信号359049049直接领取,直接发最新下载地址. 前言 ======================================================= ...

  8. Python科学计算基础篇

    关于Numpy Numpy是Python的一个矩阵类型,提供大量矩阵处理函数,内部通过C实现. 包含两种数据结构,数组array和矩阵matrix,其实就是array而已 构建数组array 通过tu ...

  9. 《Python科学计算基础教程》 -- 读书笔记

    文章目录 Python科学计算基础教程 代码路径 http://www.github.com/sundaygeek/MasteringPythonScirntificComputing 第1章 科学计 ...

最新文章

  1. Jquery实现form表单回填数据
  2. MongoDB主从复制介绍(转)
  3. Android Framework层的蓝牙管理
  4. 指令系统——数据存放、指令寻址(详解)
  5. ko文件卸载 linux_调试lcd时候给linux单板移植tslib
  6. 华为留了一手!将继续发布P50、Mate50:搭载麒麟9000...
  7. Linux基础——为什么要学Linux?
  8. easyui 时间段校验,开始时间小于结束时间,并且时间间隔不能超过30天
  9. python的内置函数 剖析
  10. 中兴光猫F412超级管理员密码获取
  11. 互联网、大公司常用的英文缩写
  12. 一行代码查看电脑Wifi密码
  13. luogu P2440 木材加工
  14. 写字机器人制作教程 midt-bot
  15. 幽灵行动:NVIDIA 310M显卡完美超频直逼中高端显卡
  16. 干货!深度学习模型的水印和验证
  17. java过滤关键字,敏感词汇
  18. java 数字转换开发票大写格式_Java转化数字为大写人民币
  19. 【电力电子技术】 THE BUCK-BOOST 升降压斩波电路
  20. phpstudy构建数据库

热门文章

  1. Photoshop:婚纱照朦胧修图法
  2. java 报警系统_GitHub - Shadow-Java/alert-system: 嵌入式-图像检测自动报警系统
  3. 同程艺龙发布二季度及上半年财报;上海迪士尼度假区推出达菲主题月 | 全球旅报...
  4. python将1到24的全部数字按顺序放到一个4行6列的二维列表里
  5. Android修行手册 - 官方SearchView搭配Toolbar/样式/其他/开源项目
  6. 安防视频越来越拉风 网有救了
  7. MySQL中查询两个日期之间的天数
  8. Windows server 下 DNS服务器 实现递归查询和循环查询的配置方法
  9. background与background-color 你“不知道”的区别
  10. 图形界限命令在命令行输入_图形界限