详解Python NumPy中矩阵和通用函数的使用
作者:PursuitingPeak 发布时间:2023-05-29 15:57:18
在NumPy中,矩阵是 ndarray 的子类,与数学概念中的矩阵一样,NumPy中的矩阵也是二维的,可以使用 mat 、 matrix 以及 bmat 函数来创建矩阵。
一、创建矩阵
mat 函数创建矩阵时,若输入已为 matrix 或 ndarray 对象,则不会为它们创建副本。 因此,调用 mat() 函数和调用 matrix(data, copy=False) 等价。
1) 在创建矩阵的专用字符串中,矩阵的行与行之间用分号隔开,行内的元素之间用空格隔开。使用如下的字符串调用 mat 函数创建矩阵:
import numpy as np
A = np.mat('1 2 3; 4 5 6; 7 8 9')
print("Creation from string:", A)
运行结果:
Creation from string:
[[1 2 3]
[4 5 6]
[7 8 9]]
2)用T属性获取转置矩阵
print("transpose A:", A.T) # 用T属性获取转置矩阵
3)用I属性获取逆矩阵
print("Inverse A:", A.I) # 用I属性获取逆矩阵
4)用NumPy数组进行创建矩阵
B = np.mat(np.arange(9).reshape(3, 3))
print("Creation from array:", B)#使用NumPy数组进行创建
上述运行结果:
Creation from string:
[[1 2 3]
[4 5 6]
[7 8 9]]
transpose A:
[[1 4 7]
[2 5 8]
[3 6 9]]
Inverse A:
[[ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]
[-6.30503948e+15 1.26100790e+16 -6.30503948e+15]
[ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]]
Creation from array:
[[0 1 2]
[3 4 5]
[6 7 8]]
二、从已有矩阵创建新矩阵
希望利用一些已有的较小的矩阵来创建一个新的大矩阵。这可以用 bmat 函数来实现。这里的 b 表示“分块”, bmat 即分块矩阵(block matrix)。
1)先创建一个3*3的单位矩阵:
C = np.eye(3)
print("C:",C)
运行结果:
C:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
2)创建一个与C同型的矩阵,乘以2
D = 2 * C
print ("D:",D)
运行结果:
D:
[[2. 0. 0.]
[0. 2. 0.]
[0. 0. 2.]]
3)使用字符串创建复合矩阵:
字符串的格式与 mat 函数中一致,只是在这里你可以用矩阵变量名代替数字:
print("Compound matrix\n", np.bmat("C D;C D"))
运行结果:
Compound matrix:
[[1. 0. 0. 2. 0. 0.]
[0. 1. 0. 0. 2. 0.]
[0. 0. 1. 0. 0. 2.]
[1. 0. 0. 2. 0. 0.]
[0. 1. 0. 0. 2. 0.]
[0. 0. 1. 0. 0. 2.]]
三、通用函数
通用函数的输入是一组标量,输出也是一组标量,它们通常可以对应于基本数学运算,如加、减、乘、除等。
1、使用NumPy中的 frompyfunc 函数,通过一个Python函数来创建通用函数,步骤如下:
1)定义一个回答某个问题的Python函数
2)用 zeros_like 函数创建一个和 a 形状相同,并且元素全部为0的数组 result
3)将刚生成的数组中的所有元素设置其值为42
2、在 add 上调用通用函数的方法
通用函数并非真正的函数,而是能够表示函数的对象。通用函数有四个方法,不过这些方法只对输入两个参数、输出一个参数的ufunc对象有效,例如 add 函数。
其他不符合条件的ufunc对象调用这些方法时将抛出 ValueError 异常。因此只能在二元通用函数上调用这些方法。以下将逐一介绍这4个方法:
reduce()、accumulate()、 reduceat()、outer()
1) 沿着指定的轴,在连续的数组元素之间递归调用通用函数,即可得到输入数组的规约(reduce)计算结果。
对于 add 函数,其对数组的reduce计算结果等价于对数组元素求和。调用reduce 方法:
a = np.arange(9)
print("Reduce:", np.add.reduce(a)) #调用add函数的reduce方法
运行结果:
Reduce 36
2) accumulate 方法同样可以递归作用于输入数组
在 add 函数上调用 accumulate 方法,等价于直接调用 cumsum 函数。在 add 函数上调用 accumulate 方法:
print( "Accumulate", np.add.accumulate(a)) #调用add函数的accumulate方法
运行结果:
Accumulate [ 0 1 3 6 10 15 21 28 36]
3)educeat 方法需要输入一个数组以及一个索引值列表作为参数。
print ("Reduceat", np.add.reduceat(a, [0, 5, 2, 7]))
educeat 方法的作用是,在数列a中,分别计算索引间的累加,比如上述的 [0, 5, 2, 7],分别计算索引0-5,5-2(5>2,所以直接取索引为5的数据),2-7,7-(-1) 等四组序列形成的
比如,0-5就是计算A-E列中的数据,结果为10;5-2,直接取索引为5,即F的数据5;2-7,即B-G的计算结果为20;7-(-1)即索引7到最后,也即H、I的计算结果为15。
4)outer 方法
返回一个数组,它的秩(rank)等于两个输入数组的秩的和。它会作用于两个输入数组之间存在的所有元素对。在 add 函数上调用 outer 方法:
print("Outer:\n", np.add.outer(np.arange(3), a))
运行结果:
Outer:
[[ 0 1 2 3 4 5 6 7 8]
[ 1 2 3 4 5 6 7 8 9]
[ 2 3 4 5 6 7 8 9 10]]
四、算术运算
在NumPy中,基本算术运算符+、-和 * 隐式关联着通用函数 add 、 subtract 和 multiply ,对NumPy数组使用这些算术运算符时,对应的通用函数将自动被调用。除法包含
的过程则较为复杂,在数组的除法运算中涉及
三个通用函数 divide 、 true_divide 和floor_division ,以及两个对应的运算符 / 和 // 。
1、除法运算:
import numpy as np
a = np.array([2, 6, 5])
b = np.array([1, 2, 3])
print("Divide:\n", np.divide(a, b), np.divide(b, a))
除了divide()函数外,还有floor_divide(),以及运算符‘/’和‘//’,(‘/’和‘//’分别和divide和floor_divide作用一样)如下代码:
import numpy as np
a = np.array([2, 6, 5])
b = np.array([1, 2, 3])
print("Divide:\n", np.divide(a, b), np.divide(b, a))
print("True Divide:\n", np.true_divide(a, b), np.true_divide(b, a))#回除法的浮点数结果而不作截断
print("Floor Divide:\n", np.floor_divide(a, b), np.floor_divide(b, a)) #返回整数结果
c = 3.14*b
print("Floor Divide2:\n", np.floor_divide(c, b), np.floor_divide(b, c)) #返回整数结果
print( "/ operator:\n", a/b, b/a) # "/"运算符相当于调用 divide 函数
print( "// operator:\n", a//b, b//a) #运算符//对应于floor_divide 函数
print( "// operator2:\n", c//b, b//c)
运行结果:
Divide:
[2. 3. 1.66666667] [0.5 0.33333333 0.6 ]
True Divide:
[2. 3. 1.66666667] [0.5 0.33333333 0.6 ]
Floor Divide:
[2 3 1] [0 0 0]
Floor Divide2:
[3. 3. 3.] [0. 0. 0.]
/ operator:
[2. 3. 1.66666667] [0.5 0.33333333 0.6 ]
// operator:
[2 3 1] [0 0 0]
// operator2:
[3. 3. 3.] [0. 0. 0.]
2、模运算
计算模数或者余数,可以使用NumPy中的 mod 、 remainder 和 fmod 函数。当然,也可以使用 % 运算符。这些函数的主要差异在于处理负数的方式。
a = np.arange(-4, 4)
print('a:',a)
print ("Remainder", np.remainder(a, 2)) # remainder 函数逐个返回两个数组中元素相除后的余数
print ("Mod", np.mod(a, 2)) # mod 函数与 remainder 函数的功能完全一致
print ("% operator", a % 2) # % 操作符仅仅是 remainder 函数的简写
print ("Fmod", np.fmod(a, 2))# fmod 函数处理负数的方式与 remainder 、 mod 和 % 不同
运行结果:
a: [-4 -3 -2 -1 0 1 2 3]
Remainder [0 1 0 1 0 1 0 1]
Mod [0 1 0 1 0 1 0 1]
% operator [0 1 0 1 0 1 0 1]
Fmod [ 0 -1 0 -1 0 1 0 1]
实际代码运行如下:
来源:https://www.cnblogs.com/codingchen/p/16352881.html


猜你喜欢
- pip使用过程中的痛苦,大家相必都已经知道了,目前豆瓣提供了国内的pypi源,源包相对会略有延迟,但不影响基本使用。pip install
- Git 是什么?Git 是一个分布式的代码管理容器,本地和远端都保有一份相同的代码。 Git 仓库主要是由是三部分组成:本地代码,缓存区,提
- PyCharm 光标变成了黑块,不能编辑代码。光标变黑块是因为输入方式变成了改写方式,INSERT可以切换 插入/改写模式。插入模式:把输入
- 1. 线程的概念:线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程
- 在asp代码中分页是有点麻烦的事情,个人在在代码编写过程中把分页代码写成了两个函数,虽然在功能上不是很完善,但对于一般的应用应该是满足的了。
- 本文实例为大家分享了Python求多幅图像栅格值的平均值,供大家参考,具体内容如下本程序所采用的方法并不是最优方法,ARCGIS已经提供了相
- 本文实例讲述了PHP使用PHPexcel导入导出数据的方法。分享给大家供大家参考,具体如下:导入数据:<?phperror_repor
- 以前写过一篇:python实现把两个二维array叠加成三维array示例这篇文章尝试用“曲线救国”的方法来解决二维数组叠加成三维数组的问题
- 目录一.前提二.token加密与解密三.视图CBV四.framework认证功能五.利用postman软件在前端提交一.前提首先是这个代码基
- 最近在做搜索设计时,发现了两个容易纠结的小问题,在这里谈谈自己的一些分析。问题一:提交的关键字是哪个?凡客的这个例子中,搜索建议“时尚斜拉链
- 格式化是通过格式操作使任意类型的数据转换成一个字符串。例如下面这样<script>console.log(chopper.for
- 使用ajax获取服务器数据返回给客户端,出现中文乱码。在之前的一个ajax应用中指定codepage=936,将所有页面编码都指定为GB23
- 代码如下:ALTER proc [dbo].[sp_common_paypal_AddInfo] ( @paypalsql va
- 本文实例为大家分享了python实现微信每日一句自动发送的具体代码,供大家参考,具体内容如下参考了一篇博客:教你使用python实现微信每天
- 使用python可以对windows系统的音量进行读取或者设置。平台:visual studio code语言:python需要的pytho
- 一、抓取全部评论吾的这篇文章,有 1022 次评论,一条条看,吾看不过来,于是想到 Python 词云,提取关键词,倒也是一桩趣
- HTTPX是Python3的功能齐全的HTTP客户端,它提供同步和异步API,并支持HTTP/1.1和HTTP/2安装pip install
- 目录1、requests项目单元测试状况2、简单工具类如何测试2.1 test_help 实现分析2.2 test_hooks 实现分析2.
- 一、官方文档介绍官网nn.Conv2d:对由多个输入平面组成的输入信号进行二维卷积二、torch.nn.Conv2d()函数详解参数详解to
- 本文实例讲述了Python实现列表删除重复元素的三种常用方法。分享给大家供大家参考,具体如下:给定一个列表,要求删除列表中重复元素。list